C 單例模式的多種簡單實現

2022-06-23 03:51:14 字數 2707 閱讀 5524

這裡我就不做過多的解釋了, 畢竟關於singleton的資料實在是太多太多了。點選這裡

1.簡單的思路就是, 建立物件單例的動作轉移到另外的行為上面, 利用乙個行為去建立物件自身, 如下: 

public

class

singleton

private

static singleton _singleton = null

;

public

static

singleton createinstance()

return

_singleton;}}

這樣寫看上去是沒有問題, 但是有沒有那種可能, 同時兩個動作都判斷這個物件為空, 那麼這個物件就會被建立2次?是的, 多執行緒中, 這樣是無法保證單例。

就像這樣, 同時建立多個執行緒去建立這個物件例項的時候, 會被多次建立, 這個時候, 對**改進一下。

public

class

singleton

private

static singleton _singleton = null

;

private

static

object singleton_lock = new

object(); //

鎖同步public

static

singleton createinstance()

}return

_singleton;}}

除錯**:

taskfactory taskfactory = new

taskfactory();

list

tasklist = new list();

for (int i = 0; i < 5; i++)

));}

結果:

上面, 我們建立了多個執行緒,同時去建立這個物件的例項, 在第二次,物件命名已經被建立了, 儘管只建立了一次滿足了我們的需求, 但是我們已知物件被建立了, 還需要進來做不必要的動作嗎?

我們都知道, 同步鎖為了達到預期的效果, 也是損耗了效能的, 那麼下面的輸出, 很顯然是沒必要的動作, 所以我們優化一下。

public

class

singleton}}

return

_singleton;}}

結果:

很顯然, 這樣達到了我們的預期, 物件在被建立後, 就沒必要做多餘的行為。

public

sealed

class

singleton

private

static

readonly singleton singleinstance = new

singleton();

public

static

singleton getinstance}}

是不是覺得很優雅, 利用靜態變數去實現單例,  由clr保證,在程式第一次使用該類之前被呼叫,而且只呼叫一次

ps: 但是他的缺點也很明顯, 在程式初始化後, 靜態物件就被clr構造了, 哪怕你沒用。

public

class

singletonsecond

public

static

singletonsecond createinstance()

}

靜態建構函式:只能有乙個,無引數的,程式無法呼叫 。

同樣是由clr保證,在程式第一次使用該類之前被呼叫,而且只呼叫一次。

同靜態變數一樣, 它會隨著程式執行, 就被例項化, 同靜態變數乙個道理。

延遲載入或延遲載入是一種設計模式,或者您可以說這是乙個概念,通常用於將物件的初始化延遲到需要時。因此,延遲載入的主要目標是按需載入物件,或者您可以根據需要說出物件。

作為 .net framework 4.0 的一部分引入的惰性關鍵字為惰性初始化(即按需物件初始化)提供了內建支援。如果要使物件(如 singleton)以延遲初始化,則只需將物件的型別(單例)傳遞給lazy 關鍵字,如下所示。

private

static

readonly lazyinstancelock = new lazy(() => new singleton());

1

public

sealed

class

singleton25

6private

static

readonly lazyinstancelock =

7new lazy(() => new

singleton());89

public

static

singleton getinstance

1015

}16 }

單例模式的C 簡單實現

具體例子如下 懶漢式單例模式 include using namespace std 定義singleton類,用來表示單例模式 class singleton 實現singleton類中的方法和靜態資料成員 singleton singleton getinstance singleton sin...

單例設計模式多種實現方式

public class singleton 私有化建構函式,防止new物件 public static singleton getinstance public class singleton public static singleton getinstance return intance 這...

單例模式的多種寫法

public class singleton 私有化構造器 private static singleton instance null 類的內部建立物件 public static singleton getinstance return instance 餓漢class singleton2 只...