
文章目錄
- 一.單例模式
- 二.單例模式的兩種實現(xiàn)方式
-
一.單例模式
- 一個類只能創(chuàng)建一個對象,這樣的類的設(shè)計模式就稱為單例模式,該模式保證系統(tǒng)中該類只能有一個實例(并且父子進程共享),一個很典型的單例類就是C++STL的內(nèi)存池
- C++單例模式的基本設(shè)計思路:
- 私有化構(gòu)造函數(shù),刪除默認的拷貝構(gòu)造函數(shù)和賦值運算符重載防止對象被直接創(chuàng)建和拷貝
- 單例對象的內(nèi)存資源可以交給操作系統(tǒng)來釋放,也可以自定義析構(gòu)函數(shù)來完成特殊操作
二.單例模式的兩種實現(xiàn)方式
餓漢模式
- 餓漢單例類在程序進入主函數(shù)之前就創(chuàng)建出唯一的實例
class HungerSingleton
{
public:static HungerSingleton* Getinstance(){return &singleObj;}
private:HungerSingleton() { cout << "單例對象創(chuàng)建" << endl; }HungerSingleton(const HungerSingleton& single) = delete;HungerSingleton& operator=(const HungerSingleton& single) = delete;private:static HungerSingleton singleObj;
};
HungerSingleton HungerSingleton::singleObj;
HungerSingleton
的靜態(tài)成員變量是自身類型的對象(或指針),類的靜態(tài)成員變量在進入主函數(shù)之前就完成初始化,由于構(gòu)造函數(shù)被私有化,因此在程序運行過程中無法再創(chuàng)建該類的對象- 餓漢單例模式的優(yōu)勢:
- 由于子進程只能在主函數(shù)中被創(chuàng)建,因此餓漢單例類不存在線程安全問題,無需與其他線程的類競爭系統(tǒng)資源,在多線程高并發(fā)環(huán)境下能夠較為高效地執(zhí)行任務(wù)
- 餓漢單例模式的劣勢:
- 如果一個程序中有多種餓漢單例類,我們無法控制它們的初始化順序
- 餓漢單例類會拖慢程序的啟動速度,而且即便用不到該類也會創(chuàng)建一個實例,可能造成內(nèi)存浪費
懶漢模式
- 懶漢單例類在程序進入主函數(shù)之后由后續(xù)代碼決定是否創(chuàng)建實例
class LazySingleton
{
public:static LazySingleton* Getinstance(){if (singleObj == nullptr){singleObj = new LazySingleton;}return singleObj;}
private:LazySingleton() { cout << "單例對象創(chuàng)建" << endl; }LazySingleton(const LazySingleton& single) = delete;LazySingleton& operator=(const LazySingleton& single) = delete;private:static LazySingleton* singleObj;
};
LazySingleton * LazySingleton::singleObj = nullptr;
LazySingleton
類在第一次調(diào)用Getinstance()
成員接口時才會創(chuàng)建實例- 懶漢單例模式的優(yōu)勢:
- 可以控制多種懶漢單例類對象的初始化順序,并且需要用到的時候才創(chuàng)建,避免了內(nèi)存浪費
- 懶漢單例模式的劣勢:
- 在多線程環(huán)境中存在線程安全問題,需要加鎖
