設(shè)計模式01 - 單例模式

1. 定義:指一個類只有一個實例,且該類能自行創(chuàng)建這個實例的一種模式,特點如下
  • 單例類只有一個實例對象
  • 該單例對象必須由單例類自行創(chuàng)建
  • 單例類對外提供一個訪問該單例的全局訪問點
2. 懶漢式單例:類加載時沒有生成單例,只有當(dāng)?shù)谝淮握{(diào)用 getlnstance 方法時才去創(chuàng)建這個單例
  • 線程不安全的實現(xiàn)
//CSingleton.h
class CSingleton  
{  
public:  
    static CSingleton* GetInstance()  
    {
        if ( m_pInstance == NULL )
            m_pInstance = new CSingleton(); 
        return m_pInstance;  
    }  

protected:
    CSingleton() { }
    ~CSingleton() { }

private:  
    static CSingleton* m_pInstance;  
};

兩個線程同時首次調(diào)用instance方法且同時檢測到p是NULL值,則兩個線程會同時構(gòu)造一個實例給m_pInstance

  • 加鎖的經(jīng)典懶漢實現(xiàn)
//CSingleton.h
class CSingleton  
{
public:
    static pthread_mutex_t mutex;
    static CSingleton* GetInstance();

protected:
    CSingleton()
    {
        pthread_mutex_init(&mutex);
    }

private:
    static CSingleton* m_pInstance;
};

//CSingleton.cpp
pthread_mutex_t CSingleton::mutex;
CSingleton* CSingleton::m_pInstance = NULL;
CSingleton* CSingleton::GetInstance()
{
    if (m_pInstance  == NULL)
    {
        pthread_mutex_lock(&mutex);
        if (m_pInstance  == NULL)
            m_pInstance  = new CSingleton();
        pthread_mutex_unlock(&mutex);
    }
    return m_pInstance;
}
  • 內(nèi)部靜態(tài)變量的懶漢實現(xiàn)
class CSingleton  
{  
public:  
    static CSingleton* GetInstance()  
    {
        static CSingleton m_pInstance = CSingleton(); 
        return &m_pInstance; 
    }  

protected:
    CSingleton() { }
    ~CSingleton() { }
};
3. 餓漢式單例:類一旦加載就創(chuàng)建一個單例,保證在調(diào)用 getInstance 方法之前單例已經(jīng)存在(線程安全)
//CSingleton.h
class CSingleton    
{    
public:    
    static CSingleton* GetInstance() { return m_CSingletonInstance; }  

protected:
  CSingleton() { }
  ~CSingleton() { }

private:
  static CSingleton* m_CSingletonInstance;
};

//CSingleton.cpp
CSingleton* CSingleton::m_CSingletonInstance = new CSingleton();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容