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