設計模式 單例模式 C

2022-08-21 20:54:12 字數 1343 閱讀 1715

1. getinstance()函式返回值為指標

為了防止拷貝出現,getinstance()可以返回指標或者引用:

a *m_pa = a::getinstance();

a &a = a::getinstance();

返回引用,對呼叫時候的定義有一定的要求,不如直接返回指標方便;

萬一呼叫者沒有使用引用的方法,而是直接a a = a::getinstance()呼叫,就是通過拷貝實現,和單例不符!

實際上,c++的單例模式一般都返回指標,所以為了通用性,getinstance()需要返回指標!

2. static修飾getinstance()函式

目的是為了「無物件呼叫」:a::getinstance(),畢竟呼叫getinstance()的時候,還沒有物件建立出來。

3. 建構函式私有化

建構函式私有化,是為了讓外界無法呼叫建構函式,但是getinstance()函式肯定會呼叫建構函式的。

4. 如何析構?

普通物件在類外通過new建立,在類外通過delete刪除,new的時候自動呼叫建構函式,delete的時候自動呼叫析構函式;

單例模式假如在建構函式中new,到底是先執行建構函式還是先執行new?都說不通!

同理,單例模式的delete也不可以在析構函式中執行,因為只有delete的時候才執行析構函式,而執行析構函式的時候又delete?

迴圈呼叫的結果表面上看是析構多次,但其實一次都沒有完成!一直在呼叫函式的路上。

解決方法:

1. getinstance()獲得指標之後,delete指標;

2. 類似getinstance()建立物件,也可以再定義乙個函式比如,deleteinstance()來直接delete物件。

缺點:兩種方法都是手動呼叫delete,容易忘記

3. 內嵌類

內嵌乙個新類,並在單例類中包含該新類的物件,而且是靜態型別的;

系統退出的時候會自動刪除該類的靜態成員,該新類是靜態型別,刪除的時候呼叫新類的析構函式;

在新類的析構函式中delete單例模式的new指標,實現了自動delete!

5. 實現方法

單例模式可以使用new(每次判斷是否為null),和區域性靜態變數static,兩種方法實現;

前者需要考慮:執行緒安全問題(多個執行緒同時getinstance(),如何保證只建立乙個?),如何delete(只能增加內嵌類);

後者使用靜態區域性變數,在c++11之後,static已經是執行緒安全的了,而且系統自動釋放資源,不用額外考慮delete;

綜上,強烈推薦使用static實現單例模式!

static a*getinstance()

參考:

設計模式 C 設計模式 單例模式

設計模式 物件導向設計七大原則 設計模式 設計模式概念和分類 設計模式 c 設計模式 單例模式 設計模式 c 設計模式 工廠方法模式 設計模式 c 設計模式 抽象工廠模式 設計模式 c 設計模式 建造者模式 設計模式 c 設計模式 原型模式 作者自用的泛型單例模組 單例模式 singleton pa...

C 設計模式 (單例模式)

單例模式 顧名思義,只有乙個物件例項,即保證乙個類只有乙個物件可以使用。作用類似於乙個全域性變數,可以任意呼叫,但是比全域性變數更容易管理,使用。單例模式也有很多種實現方式 第一種實現方法 h檔案 class csock test public casyncsocket cpp檔案 csock te...

設計模式 單例模式(c )

在gof 設計模式 中,單例模式的定義為 保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。下面是單例模式的c 實現 方案一 建構函式和拷貝建構函式一定要宣告為private 定義static成員 單例指標和獲取單例指標的函式 static單例指標要在類外定義並初始化 實現獲取單例指標的函式時...