單例模式的C++實現

#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

相關文章
相關標籤/搜索