C++ 單例模式的詳解及實(shí)例
C++ 單例模式的詳解及實(shí)例
1.什么叫單例模式?
單例模式也稱為單件模式、單子模式,可能是使用最廣泛的設(shè)計(jì)模式。其意圖是保證一個類僅有一個實(shí)例,并提供一個訪問它的全局訪問點(diǎn),該實(shí)例被所有程序模塊共享。有很多地方需要這樣的功能模塊,如系統(tǒng)的日志輸出,GUI應(yīng)用必須是單鼠標(biāo),MODEM的聯(lián)接需要一條且只需要一條電話線,操作系統(tǒng)只能有一個窗口管理器,一臺PC連一個鍵盤。
通過單例模式, 可以做到:
(1)確保一個類只有一個實(shí)例被建立
(2)提供了一個對對象的全局訪問指針
(3)在不影響單例類的客戶端的情況下允許將來有多個實(shí)例
2.怎樣實(shí)現(xiàn)單例模式
一個簡單的單例模式該怎樣去實(shí)現(xiàn):構(gòu)造函數(shù)聲明為private或protect防止被外部函數(shù)實(shí)例化,內(nèi)部保存一個private static的類指針保存唯一的實(shí)例,實(shí)例的動作由一個public的類方法代勞,該方法也返回單例類唯一的實(shí)例。
3.具體實(shí)現(xiàn)
(1)最簡單的單例模式(懶漢模式)
懶漢模式:懶漢式的特點(diǎn)是延遲加載,比如配置文件,采用懶漢式的方法,顧名思義,懶漢么,很懶的,配置文件的實(shí)例直到用到的時候才會加載。
class SiglenTon { public: static SiglenTon *GetInstence() { if( p == NULL) { p = new SiglenTon(); } return p; } private: SiglenTon() { cout<<"SiglenTon()"<<endl; } static SiglenTon *p; }; SiglenTon *SiglenTon::p = NULL; int main() { SiglenTon *p = SiglenTon::GetInstence(); return 0; }
(2)第一種方式?jīng)]有考慮到線程安全
class SiglenTon //(線程安全的餓漢模式) { public: static SiglenTon *GetInstence() { cout<<"static SiglenTon *GetInstence()"<<endl; pthread_mutex_lock(&mutex); if( p == NULL) { pthread_mutex_lock(&mutex); p = new SiglenTon(); pthread_mutex_unlock(&mutex); } pthread_mutex_unlock(&mutex); return p; } private: SiglenTon() { cout<<"SiglenTon()"<<endl; } static SiglenTon *p; }; SiglenTon *SiglenTon::p = NULL; int main() { SiglenTon *p = SiglenTon::GetInstence(); SiglenTon *p1 = p->GetInstence(); return 0; }
(3)餓漢模式(餓漢模式本身就是線程安全的)
class SiglenTon { public: SiglenTon *GetInstence() { if( p == NULL) { return p; } } private: SiglenTon() { cout<<"SiglenTon()"<<endl; } static SiglenTon *p; };
以上就是對C++ 中單例模式的講解,如有疑問請留言或者到本站社區(qū)進(jìn)行交流討論,感謝閱讀,希望幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
c++利用vector創(chuàng)建二維數(shù)組的幾種方法總結(jié)
這篇文章主要介紹了c++利用vector創(chuàng)建二維數(shù)組的幾種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11詳解C++ 參數(shù)的三種傳遞方式和應(yīng)用場景
這篇文章主要介紹C++ 參數(shù)的三種傳遞方式和應(yīng)用場景,C++ 參數(shù)的三種傳遞方式分別是值傳遞、指針傳遞和引用傳遞,感興趣的同學(xué)可以參考閱讀下2023-06-06QT連接SQLServer數(shù)據(jù)庫的實(shí)現(xiàn)
要使用Qt連接SQL Server數(shù)據(jù)庫,需要使用Qt提供的SQL模塊和SQL Server驅(qū)動程序,具有一定的參考價值,感興趣的可以了解一下2023-09-09用C++實(shí)現(xiàn)strcpy(),返回一個char*類型的深入分析
本篇文章是對用C++實(shí)現(xiàn)strcpy(),返回一個char*類型進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05