對單例模式的乙個簡單思考

2022-03-11 02:53:07 字數 1213 閱讀 9649

測試**如下:

#include class

testsingleton

static testsingleton& getinstance(int

i)

private

: testsingleton(

inti):m_i(i)

intm_i;

};int

main()

**很簡單,最終的結果怎樣呢?

我原本以為1和2都會輸出的,因為兩次分別呼叫getinstance時用的是不一樣的引數,所以應該會例項出兩個不一樣的testsingleton物件吧,最終的結果和我料想的有所不同:

只構造出了引數為1的singleton物件,並沒與改造出引數為2的物件,這是為什麼呢?仔細思考了一下,然後就頓悟了,哎,原因還是出了對static關鍵字的理解不深,這麼快就忘記了。

在函式體中,如果宣告了乙個static變數,不管進入這個函式多少次,該static變數只會被初始化一次。

所以當我第二次呼叫getinstance函式時,進入getinstance後直接就跳過了testsingleton的初始化語句,也就是testsingleton的建構函式,因此最終得到的testsinglon物件和上次的是同乙個。我打斷點除錯的時候發現確實如此。

從這裡我收穫了乙個小小的道理,單例模式的建構函式不應該傳參,如果需要傳參的話,這個類就應該被設計為普通類。因為如果需要傳參的話,就很根據不同的引數生成不同的類的例項,與單例類「乙個類只存在乙個物件」的設定不符。

其實道理與下面這個是相似的。

void fun(int

i)int

main()

最終兩次的輸出結果依然都是1,因為m只被初始化一次。

void fun(int

i)int

main()

最終的輸出仍然為兩個1,這段和上段**有點類似於類的拷貝構造和賦值構造 都是」建構函式」。

void fun(int

i)int

main()

這樣的話輸出結果就變成乙個1和乙個2了。

乙個單例模式的簡單例子

ex1 public class singleton public static singleton getinstance return singleton 這個不多說了,肯定是錯誤的,如果多個執行緒訪問的時候都是 null,那麼接下來就是產生多個例項。不算單例模式。ex2 public clas...

設計乙個簡單的單例設計模式

概念 單例模式 singleton pattern 涉及乙個單一的類,確保只有單個物件被建立。這個類提供一種訪問其唯一物件的方式,可以直接訪問,不需要例項化該類的物件。注意 1 單例類只能有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。1.餓漢式 餓漢式是...

如何設計乙個單例模式

單例類最簡單的c 實現 class single single static single getinstance return m pinstance single single m pinstance null 單例要求 參考 劍指offer c 保證執行緒安全 class single ret...