文章目錄
- 1. 單例模式
- 2. 單例模式簡單示例
- 3. 懶漢模式
- 4. 餓漢模式
- 5. 懶漢式和餓漢式的區別
1. 單例模式
-
🐧定義:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
-
單例模式是一種常用的軟件設計模式,在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實列而且該實例易于外界訪問,從而方便對實例個數的控制并節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
特點:
-
🍎單例類只有一個實列對象。
-
🍎單例類必須自己創建自己的唯一實例。
-
🍎單例類對外提供一個可訪問該單例的全局訪問點。
主要解決:全局使用的類頻繁地創建與銷毀。
優點:避免對資源的多重占用。在內存里只有一個實例,減少內存的開銷,尤其是頻繁的創建和銷毀實例。
2. 單例模式簡單示例
// 單例模式 --- 不讓用戶自己創建對象
class TestA {public: // 設置為靜態成員函數,可以不用創建對象直接通過類名進行訪問static TestA* GetInstance() {return data;}private:// 把構造函數定為 private,目的是不讓用戶自己創建對象,必須把構造函數進行設為私有化TestA() {data = new TestA;}private:static TestA* data;};TestA* TestA::data = NULL; // 靜態成員變量必須在類外部單獨進行定義int main()
{TestA::GetInstance();
}
3. 懶漢模式
class SingleModeLazy {private:SingleModeLazy() {cout << "執行操作: 懶漢式構造函數被調用。" << endl;}public:static SingleModeLazy* GetInstance() {if (ptrSingleModeLazy == NULL) {ptrSingleModeLazy = new SingleModeLazy();}return ptrSingleModeLazy;}private:static SingleModeLazy* ptrSingleModeLazy;};SingleModeLazy* SingleModeLazy::ptrSingleModeLazy = NULL;
4. 餓漢模式
// 餓漢式class SingleHungry {private:SingleHungry() {cout << "執行操作:餓漢構造函數被調用。" << endl;}public:static SingleHungry* GetInstance() {return ptrSingleHungry;}private:static SingleHungry* ptrSingleHungry;
};SingleHungry* SingleHungry::ptrSingleHungry = new SingleHungry;
5. 懶漢式和餓漢式的區別
-
🍎實例創建時機:
(1)餓漢式在程序啟動時就創建實例;
(2)懶漢式在第一次使用時才創建實例; -
🍎資源利用:
(1)餓漢式可能會造成資源浪費,因為它不管是否使用這個實例都會創建實例;
(2)懶漢式只有在需要時才創建實例,更加節省資源; -
🍎線程安全:
(1)餓漢式不需要考慮線程安全問題,因為實例在程序啟動時就已經創建;
(2)懶漢式需要考慮線程安全問題,因為多個線程可能嘗試同時創建實例; -
🍎適用場景:
(1)如果實例必須在程序啟動時就可用,或者資源消耗不大,可以選擇餓漢式。
(2)如果實例可能不被使用,或者資源消耗較大,希望延遲加載,可以選擇懶漢式。