C++單件類,設計模式-單件

轉載地址:http://www.cnblogs.com/phoenixzq/archive/2011/05/17/2049030.html

定義
單件(Singleton)模式保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
  
結構
 
理解
1.       Singleton模式用來取代全局靜態變量。C++通過靜態成員變量來實現類實例全局唯一性。
2.       instance()方法是單件提供的唯一調用入口。
 
要點
1.       爲了防止外界調用產生多個實例,將構造方法、析構方法、拷貝構造方法、賦值重載方法都作爲protected
2.       instance()方法產生對象方式有兩種:使用局部static對象,生命期在首次進入局部生命期產生,在程序結束時銷燬;通過new產生新對象,在析構方法中delete對象。
3.       獲取單件實例調用方式:Singleton::instance()獲取對象指針。
4.       解決多線程資源競爭條件。使用著名的“雙檢測鎖定”辦法來解決,即在鎖定前和鎖定後都檢測對象是否產生,這樣既能保證加鎖效率又能保證單件實例的唯一性。
 
應用
1.       代碼部分使用類模版單件(CSingleton<T>),可產生不同種類的單件類。
2.       一個類要成爲單件類,把單件類作爲自己的友元來實現。因爲CSingleton的構造和析構都是protected。另外也有通過繼承單件來實現。
3.       單件可以很簡單實現,也可以足夠複雜。Loki庫實現了一個比較複雜的單件,將類型和各種策略(創建策略、生命期策略、線程策略等)作爲模板參數,封裝成了SingletonHolder類模板。詳細可見:http://loki-lib.sourceforge.net/index.php?n=Pattern.Singleton
 
源碼
#include <iostream>
using namespace std;
  
//////////////////Singleton定義
/**
* @class CSingleton
* @brief 實現類把該類作爲友元, 並且把構造函數作爲非公有
*         如:
*          Class C
*          {
*          friend class CSingleton<C>;
*          protected:
*              C(){};
*          }
*/
template<class T>
class CSingleton
{
public:
    static T* instance()
    {
        //double check. 鎖前和鎖後檢測,保證效率和多線程正確性
        if (!m_pInstance)
        {
            //TODO: 加鎖. CMutexGuard guard(m_lock);
  
            if (!m_pInstance)
            {
                //static T t;
                //m_pInstance = &t;
                m_pInstance = new T;
            }
        }
        return m_pInstance;
    };
  
protected:
    CSingleton(){}; //防止產生實例
    CSingleton(const CSingleton&){}; //防止拷貝構造另一個實例
    CSingleton &operator =(const CSingleton&){}; //防止賦值構造出另一個實例
    virtual ~CSingleton()
    {
        if (m_pInstance)
        {
            delete m_pInstance;
            m_pInstance = NULL;
        }
    };
  
private:
    static T* m_pInstance; //類的唯一實例
    //TODO: 省略了互斥鎖成員m_lock
};
  
  
//////////////////Singleton實現部分
template<class T> T* CSingleton<T>::m_pInstance = NULL;
  
  
/////////////////Singleton應用實例
class CMyLog
{
    
friend class CSingleton<CMyLog>; //作爲友元可以訪問CSingleton的保護成員
  
public:
    void Log(char* pszStr)
    {
        cout << "Log msg: " << pszStr << endl;
    }
  
private:
    CMyLog(){}; //不允許直接實例化
};
  
int main()
{
    CMyLog* pLog = CSingleton<CMyLog>::instance();
    pLog->Log("hello word");
  
    system("pause");
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章