1. 單例模式的作用
保證多個程序內,(即使多執行緒訪問)該物件的例項只有乙個,而且只會被建立一次。
2. 單例模式什麼時候用?
該物件的建構函式非常耗時,例項化一次該物件,需要非常長的時間,這樣如果每次都去建立,會消耗很多資源。
3. 單例模式的代價
private static singleton _singleton = null; 該靜態物件不會被**,會常駐記憶體。
4. 特別注意
單例只保證了例項的唯一,並不能保證例項中的方法或變數也唯一,所以單例中的方法或變數,在多執行緒面前,仍然可能是不安全的。
5. 單例模式的三種寫法
雙if+lock(懶漢模式)、靜態建構函式(餓漢模式)、靜態變數(餓漢模式)。
(1). 雙if+lock
下面重點介紹「雙if+lock」由單執行緒→多執行緒的演變過程。
1public
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). 靜態建構函式
1public
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). 靜態變數
1public
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...