模板單例實現

2022-04-16 09:33:49 字數 2248 閱讀 6936

#模板單例實現

本文參考 [用模板實現單例模式]( "用模板實現單例模式") ,並且在此基礎上做了適當的改進,使其支援更多功能。

#ifndef singleton_h__

#define singleton_h__

template

class singletion

private:

singletion(){};

virtual ~singletion(){};

singletion(const singletion& ){};

singletion& operator=(const singletion&){};

};

endif // singleton_h__

/*

具體使用方法如下:

// 定義具體單例

class ccenterimp

}

typedef singletionccenter;

// 使用單例方法

ccenter::getinstance()->print();

注意,要以typedef的方法來定義單例具體名稱,具體單例ccenterimp的建構函式中初始化相關資源,在析構函式中釋放相關資源。

提出問題1:為什麼不用雙重double的方式?

回答:雙重double檢查外加互斥鎖的方式可以在滿足獲取要求,但什麼時候釋放申請的記憶體不好控制,以下是改進版雙重檢測

if (null == m_pinstance)

// lock相關

if (null == m_pinstance)

t* temp = new t();  // 先new乙個示例出來賦給臨時變數

m_pinstance = temp;  // 在賦值給真實的變數

return m_pinstance;

如果不需要做成模板復用的話,可以在此單例子中在增加乙個內部巢狀靜態類,在其析構函式中釋放這裡申請的記憶體,但如果要做成模板類的話,這個內嵌類就沒法實現了,因此放棄這種方式。

思考2:對於new出乙個單例的方式,如何放置釋放處理函式。

回答: 參考網上的處理,有atexit函式,此函式是中的函式,可以註冊一系列函式,用於在main函式退出後執行,在單例例項不多的情況下,可以考慮使用,但一定要注意它自身的限制,iso c規定,乙個程序在退出時,最多可以註冊32個atexit函式,這些函式依次被exit函式所呼叫,如果要做成模板單例,供其他模組使用,就會有數量上的限制。 

思考4:單例類可以在外部new乙個出來或者在本地定義乙個區域性變數嗎?

回答:因為要構造乙個單例類,所以這個單例類的建構函式一定不能是private或者是protect型別的,但是,這樣一類,就可以直接在外部定義這樣乙個類了,不管你是在單例的getinstance裡面new出來,還是 區域性靜態變數出來,都需要建構函式。

思考5: 區域性靜態變數的單例模式需不需要加鎖?

回答: 參考此篇文章, 如果加鎖保護,那麼以後每次呼叫getinstance都會有鎖,如果不加鎖,如果建構函式中執行的時間較長,在多執行緒環境下,可能會這個變數構造到一半,就被另乙個執行緒拿過去用了。為了平衡這兩種情況,在程式中,對於此單例有可能有多執行緒訪問的情況下,在程式啟動初始化時,顯示呼叫乙個ccenter::getinstance(),手動觸發初始化操作後,然後開啟多執行緒,這樣,既保證了在多執行緒工作時,此單例肯定是初始化完成了,在獲取時,也不需要加鎖,快速直接。備註:區域性靜態變數的執行緒安全性,在c++0x上的編譯器可以保證,在linux平台下的gcc編譯器可以保證,在低版本的vc下不保證,因此,不要把這個變化的部分推給編譯器。在程式初始化時,顯示呼叫一次,確保構造完成後,再開啟多執行緒相關工作,我們是可以掌控這種情況的。

思考6: 對於上文提出的,靜態區域性變數的方式,有一點要注意,模板類裡面的構造、析構、拷貝構造、賦值要設定private,實現類裡面的構造要設定為public,不能設定為protect和private。這裡有乙個小缺陷,使用者可以定義或者new ccenterimp 類,但不能定義或者new ccenter類。整個單例對外表現的物件為ccenter類,但是,ccenterimp只能定義在標頭檔案裡面,這樣,別人看到了就有誤用的可能,想來想去,也沒想到什麼好的方法,只能通過注釋文字說明來提示使用者,使用ccenter類,而不要直接使用centerimp類。

好了,關於單例的思考和討論彙總為這麼多,以後在使用時,如果需要復用,就用上述提到的模板類,如果不需要復用,簡簡單單乙個區域性靜態變數加上手動初始化,可確保萬事大吉。

模板化的單例實現

在系統的 中,我們有許多單例。從 cegui 的 中的找到乙個基於模板的類,具體 改變後如下 ifndef singleton h define singleton h include include template class singleton singleton static t insta...

單例銷毀 C 單例模式的模板實現

單例模式是一種建立型的設計模式 creational design patterns 使用單例模式進行設計的類在程式中只擁有乙個例項 single instance 這個類稱為單例類,它會提供乙個全域性的訪問入口 global access point 關於單例模式的討論可以參考singleton ...

JAVA模板 單例

模板 模板就是一種設計模式 而程式由不確定和確定的部分組成 這時我們可以把不確定的部分 抽象出來 對外界只開放訪問的模式 再使用的時候 由其子類繼承父類 通過子類重寫抽象方法 來完成不確定的部分 來看一下具體的實現 計算乙個程式的執行時間 abstract class gettime long en...