#include <iostream> using namespace std; /* 單例模式:懶漢式 一、保證該類只有一個實例。 二、考慮多線程安全 三、考慮資源釋放 */ class Lock{ public: Lock(){ //加鎖代碼 } ~Lock(){ //開鎖代碼 } }; class Singleton{ class Garbo{ //輔助類,垃圾回收器 public: ~Garbo(){ if(Singleton::pInstance != NULL){ delete Singleton::pInstance; Singleton::pInstance = NULL; } } }; private: static Singleton * pInstance; static Garbo garbo; //當程序結束時自動delete pInstance; Singleton(){}; //禁止自定義對象 Singleton(const Singleton & rhs); //禁止拷貝構造對象 const Singleton & operator=(const Singleton & rhs); ~Singleton(){ cout << "I'm deleted!"<<endl; //防止外部析構 } public: static Singleton * getInstance(); void display(){ cout << "other opeartions"<<endl; } }; //靜態成員初始化 Singleton* Singleton::pInstance = 0; Singleton::Garbo Singleton::garbo; Singleton * Singleton::getInstance(){ if(pInstance == NULL){ //懶漢式 Lock lock; //資源管理對象:利用局部對象的構造和析構來進行加鎖和開鎖; if(pInstance == NULL){ //這句並不是多餘s pInstance = new Singleton(); } } return pInstance; } int main() { Singleton *ps =Singleton::getInstance(); ps->display(); }
/*注:關於爲什麼不適用靜態成員來實習初始化一次,緣由以下:
1.若是將pInstance定義爲靜態類成員,即static Singleton Instance,而後在getInstance中返回,這樣必須在外部初始化,不屬於懶漢式;
二、若是將pInstance定義爲getInstance函數中的局部靜態變量,這樣只要getInstance不被調用,pInstance就不會有值,但在多線程環境下局部靜態變量(特別是對象)可以保證初始化一次仍然不肯定
*/
參考文獻ios