(二)singleton單例模式——餓漢模式
阿新 • • 發佈:2021-02-10
餓漢式是典型的空間換時間,當類裝載的時候就會建立類例項,不管你用不用,先創建出來,然後每次呼叫的時候,就不需要再判斷了,節省了執行時間,呼叫效率高,不能延時載入。
餓漢:不管使用者用不用得到,它都會提前例項化物件等待使用者呼叫——在單例類定義的時候就進行例項化。(本身就是執行緒安全的,如下例子)
#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,就不會執行解構函式,只能由系統回收(和懶漢模式有缺陷版一樣)。