C++ 單例模式的詳解及實例
1.什么叫單例模式?
單例模式也稱為單件模式、單子模式,可能是使用最廣泛的設計模式。其意圖是保證一個類僅有一個實例,并提供一個訪問它的全局訪問點,該實例被所有程序模塊共享。有很多地方需要這樣的功能模塊,如系統的日志輸出,GUI應用必須是單鼠標,MODEM的聯接需要一條且只需要一條電話線,操作系統只能有一個窗口管理器,一臺PC連一個鍵盤。
通過單例模式, 可以做到:
(1)確保一個類只有一個實例被建立
(2)提供了一個對對象的全局訪問指針
(3)在不影響單例類的客戶端的情況下允許將來有多個實例
2.怎樣實現單例模式
一個簡單的單例模式該怎樣去實現:構造函數聲明為private或protect防止被外部函數實例化,內部保存一個private static的類指針保存唯一的實例,實例的動作由一個public的類方法代勞,該方法也返回單例類唯一的實例。
3.具體實現
(1)最簡單的單例模式(懶漢模式)
懶漢模式:懶漢式的特點是延遲加載,比如配置文件,采用懶漢式的方法,顧名思義,懶漢么,很懶的,配置文件的實例直到用到的時候才會加載。
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)第一種方式沒有考慮到線程安全
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++ 中單例模式的講解,如有疑問請留言或者到本站社區進行交流討論,感謝閱讀,希望幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答
圖片精選