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