總結單例的一般實現比較簡單,下面是**和uml圖。由於建構函式是私有的,因此無法通過建構函式例項化,唯一的方法就是通過呼叫靜態函式getinstance。
這裡只有乙個類,如何實現singleton類的子類呢?也就說singleton有很多子類,在一種應用中,只選擇其中的乙個。最容易就是在getinstance函式中做判斷,比如可以傳遞乙個字串,根據字串的內容建立相應的子類例項。這也是dp書上的一種解法,書上給的**不全。這裡重新實現了一下,發現不是想象中的那麼簡單,最後實現的版本看上去很怪異。在vs2008下測試通過。
#pragma once
#include
using namespace std;
class singleton
protected:
//必須為保護,如果是私有屬性,子類無法訪問父類的建構函式
singleton()
private:
static singleton *singleton;
//唯一例項的指標 };
#include
"singleton.h"
#include
"singletona.h"
#include
"singletonb.h"
singleton* singleton:
:singleton =
null
; singleton* singleton:
:getinstance
(const
char
* name)
return singleton;
} #pragma once
#include
"singleton.h"
class singletona: public singleton
private:
//為保護屬性,這樣外界無法通過建構函式進行例項化
singletona()
};
#pragma once
#include
"singleton.h"
class singletonb: public singleton
private:
//為保護屬性,這樣外界無法通過建構函式進行例項化
singletonb()
};#include
"singleton.h"
intmain()
上面**有乙個地方很詭異,父類為子類的友元,如果不是友元,函式getinstance會報錯,意思就是無法呼叫singletona和singletonb的建構函式。父類中呼叫子類的建構函式,我還是第一次碰到。當然了把singletona和singletonb的屬性設為public,getinstance函式就不會報錯了,但是這樣外界就可以定義這些類的物件,違反了單例模式。
看似奇怪,其實也容易解釋。在父類中構建子類的物件,相當於是外界呼叫子類的建構函式,因此當子類建構函式的屬性為私有或保護時,父類無法訪問。為共有時,外界就可以訪問子類的建構函式了,此時父類當然也能訪問了。只不過為了保證單例模式,所以子類的建構函式不能為共有,但是又希望在父類中構造子類的物件,即需要呼叫子類的建構函式,這裡沒有辦法才出此下策:將父類宣告為子類的友元類。
設計模式1 單例模式
文章引用出處 singleton模式是最簡單最常用的設計模式。1,定義 確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個該類。2,單例模式優點 1 單例模式在記憶體中只有乙個例項,減少了記憶體的開支。2 單例模式只生成乙個例項模式,減少了系統效能的開銷。如當乙個物件的產生需要比較多的系統資...
設計模式1 單例模式
單例模式,利用工廠類只生產乙個例項或者有限個例項,比如乙個系統中只有乙個主機板,乙個顯示卡,但是有些系統中也可以存在多個,雙顯示卡,雙顯示器等等。這些在singleton module中都是可以定義的。當然我們也可以使用全域性的變數或者靜態類或者物件去做,但是單例模式的存在是有其優點的。public...
設計模式1 單例模式
保證乙個類只有乙個例項 即乙個物件,並且提供乙個訪問該例項的全域性訪問點 即類中有乙個公共的方法 方法的返回該類的物件。1.windows的任務管理器 無論開啟多少次都只能開啟乙個視窗 2.windows的 站 3.專案中的配置檔案 4.的計數器 5.日誌 6.連線池 8.spring的bean 預...