1. 程式人生 > 其它 >(二)singleton單例模式——餓漢模式

(二)singleton單例模式——餓漢模式

技術標籤:劍指offer設計模式C++單例模式

餓漢式是典型的空間換時間,當類裝載的時候就會建立類例項,不管你用不用,先創建出來,然後每次呼叫的時候,就不需要再判斷了,節省了執行時間,呼叫效率高,不能延時載入。

餓漢:不管使用者用不用得到,它都會提前例項化物件等待使用者呼叫——在單例類定義的時候就進行例項化。(本身就是執行緒安全的,如下例子)

#include "../common.h"
//final表示該類不可被繼承
//餓漢式
class CMySingleton final
{
public:
    ~CMySingleton();
    static CMySingleton *getInstance(char *pData);
    CMySingleton(CMySingleton &) = delete;
    CMySingleton &operator=(const CMySingleton &) = delete;

private:
    static CMySingleton *pCMySingleton;
    CMySingleton(char *pData);
    char *m_data;
};

CMySingleton::CMySingleton(char *pData)
{
    printf("This is Constructors (data:%s) ...\n", pData);
}
CMySingleton::~CMySingleton()
{
    printf("This is Destructor  ...\n");
    if (m_data != nullptr)
    {
        delete[] m_data;
        m_data = nullptr;
    }
}

CMySingleton *CMySingleton::getInstance(char *pData)
{
    return pCMySingleton;
}

void *pthCreate(void *)
{
    printf("into pthCreate() ... \n");
    CMySingleton *singleton_1 = CMySingleton ::getInstance(nullptr);
}

//直接例項化
CMySingleton* CMySingleton::pCMySingleton = new CMySingleton(nullptr);

int main()
{
    char data[] = "abcdefg";
    CMySingleton *singleton_1 = CMySingleton :: getInstance(data);
    CMySingleton *singleton_2 = CMySingleton :: getInstance(data);
}

結果:

This is Constructors (data:(null)) ...

本身是執行緒安全,就不需要再測。程式退出前不呼叫delete,就不會執行解構函式,只能由系統回收(和懶漢模式有缺陷版一樣)。

借鑑的大神文章地址:C++ 單例模式總結與剖析