10 單例模式

2022-02-19 22:14:59 字數 2517 閱讀 5699

1. 單例模式的作用

保證多個程序內,(即使多執行緒訪問)該物件的例項只有乙個,而且只會被建立一次。

2. 單例模式什麼時候用?

該物件的建構函式非常耗時,例項化一次該物件,需要非常長的時間,這樣如果每次都去建立,會消耗很多資源。

3. 單例模式的代價

private static singleton _singleton = null;  該靜態物件不會被**,會常駐記憶體。

4. 特別注意

單例只保證了例項的唯一,並不能保證例項中的方法或變數也唯一,所以單例中的方法或變數,在多執行緒面前,仍然可能是不安全的。

5. 單例模式的三種寫法

雙if+lock(懶漢模式)、靜態建構函式(餓漢模式)、靜態變數(餓漢模式)。

(1). 雙if+lock

下面重點介紹「雙if+lock」由單執行緒→多執行緒的演變過程。

1

public

class

sone

213 thread.sleep(1000

);14 console.writeline("

被構造...

", this

.gettype().name);15}

1617

private

static sone _sone = null;18

private

static

object sonelock = new

object

();19

20///

21///

單執行緒內單例模式

22///

23///

24public

static

sone createintance1()

2531

return

_sone;32}

33///

34///

多執行緒的單例模式(安全+但是費時,費在鎖上了)

35///

36///

37public

static

sone createintance2()

3849}50

return

_sone;51}

5253

///54

///多執行緒的單例模式(安全且不耗時)

55///

56///

57public

static

sone createintance3()

5870}71

}

72return

_sone;73}

74 }

(2). 靜態建構函式

1

public

class

stwo

213 thread.sleep(1000

);14 console.writeline("

被構造...

", this

.gettype().name);15}

1617

private

static stwo _stwo = null;18

///19

///靜態的建構函式:只能有乙個,且是無引數的

20///

由clr保證,只有在程式第一次使用該類之前被呼叫,而且只能呼叫一次

21///

22static

stwo()

2326

27public

static

stwo createintance()

2831 }

(3). 靜態變數

1

public

class

sthird

213 thread.sleep(1000

);14 console.writeline("

被構造...

", this

.gettype().name);15}

16///

17///

靜態變數:由clr保證,在程式第一次使用該類之前被呼叫,而且只呼叫一次

18///

19private

static sthird _sthird = new

sthird();

2021

public

static

sthird createintance()

2225 }

設計模式 10 單例模式

單例模式 singleton 簡介 單例模式保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。使用單例模式能夠讓設計師快速獲取提供某項服務或者功能的物件,可以省去層層傳遞物件的困擾。單例模式在實現時,需要程式語言的支援,需要程式語言具有靜態類屬性 靜態類方法以及可重新定義建構函式的訪問修飾符,...

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...