建立型模式 --- 單件模式(Singleton Pattern)
動機(Motivation):
在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個例項,才能確保它們的邏輯正確性、以及良好的效率。
如何繞過常規的構造器,提供一種機制來保證一個類只建立一個例項?
這應該是類設計者的責任,而不是類使用者的責任。
結構圖:
意圖:
保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
生活的例子:
適用性:
(1)當類只能有一個例項而且客戶可以從一個眾所周知的訪問點訪問它時。
(2)當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改程式碼就能使用一個擴充套件的例項時。
程式碼實現:
(1)單執行緒Singleton實現
class SingleThread_Singleton
{
private static SingleThread_Singleton instance = null;
private SingleThread_Singleton(){}
public static SingleThread_Singleton Instance
{
get
{
if (instance == null)
{
instance = new SingleThread_Singleton();
}
return instance;
}
}
}
以上程式碼在單執行緒情況下不會出現任何問題。但是在多執行緒的情況下卻不是安全的。
如兩個執行緒同時執行到 if (instance == null)判斷是否被例項化,一個執行緒判斷為True後,在進行建立
instance = new SingleThread_Singleton();之前,另一個執行緒也判斷(instance == null),結果也為True.
這樣就就違背了Singleton模式的原則(保證一個類僅有一個例項)。
怎樣在多執行緒情況下實現Singleton?
(2)多執行緒Singleton實現:
class MultiThread_Singleton
{
private static volatile MultiThread_Singleton instance = null;
private static object lockHelper = new object();
private MultiThread_Singleton() { }
public static MultiThread_Singleton Instance
{
get
{
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
{
instance = new MultiThread_Singleton();
}
}
}
return instance;
}
}
此程式對多執行緒是安全的,使用了一個輔助物件lockHelper,保證只有一個執行緒建立例項(如果instance為空,保證只有一個執行緒instance = new MultiThread_Singleton();建立唯一的一個例項)。(Double Check)
請注意一個關鍵字volatile,如果去掉這個關鍵字,還是有可能發生執行緒不是安全的。
volatile 保證嚴格意義的多執行緒編譯器在程式碼編譯時對指令不進行微調。
(3)靜態Singleton實現
class Static_Singleton
{
public static readonly Static_Singleton instance = new Static_Singleton();
private Static_Singleton() { }
}
以上程式碼展開等同於
class Static_Singleton
{
public static readonly Static_Singleton instance;
static Static_Singleton()
{
instance = new Static_Singleton();
}
private Static_Singleton() { }
}
由此可以看出,完全符合Singleton的原則。
優點: 簡潔,易懂
缺點: 不可以實現帶引數例項的建立。
相關文章
- 單例模式(Singleton Pattern)單例模式
- 常用設計模式-單例模式(Singleton pattern)設計模式單例
- 設計模式之單例模式(Singleton Pattern)設計模式單例
- 設計模式--單例(Singleton Pattern)設計模式單例
- PHP設計模式(一)—單例模式(Singleton Pattern)PHP設計模式單例
- 深入理解 JavaScript 單例模式 (Singleton Pattern)JavaScript單例模式
- Singleton(單例)——物件建立型模式單例物件模式
- 單例模式(Singleton)單例模式
- 單例模式 singleton單例模式
- 設計模式—singleton(單例模式)設計模式單例
- 設計模式系列之單例模式(Singleton Pattern)——確保物件的唯一性設計模式單例物件
- 使用C# (.NET Core) 實現單體設計模式 (Singleton Pattern)C#設計模式
- java設計模式-單例模式SingletonJava設計模式單例
- 設計模式-建立型-單例模式設計模式單例
- PHP設計模式(四)單例模式(Singleton)PHP設計模式單例
- 《設計模式》 - 1. 單例模式( Singleton )設計模式單例
- Singleton 單例設計模式單例設計模式
- laravel singleton 單例模式使用Laravel單例模式
- Singleton——單例模式(8種)單例模式
- Scala 與設計模式(一):Singleton 單例模式設計模式單例
- 設計模式(一)建立型之單例模式設計模式單例
- 設計模式之“物件效能模式”: Singleton 單例模式(筆記)設計模式物件單例筆記
- [DELPHI]單例模式(singleton) 陳省單例模式
- 設計模式 - 單例模式Singleton的8種寫法設計模式單例
- 建立型模式:單例模式模式單例
- 2.C#設計模式系列01_單例模式_SingletonC#設計模式單例
- Singleton設計模式設計模式
- python3中的單例模式SingletonPython單例模式
- 建立型:工廠模式-簡單工廠模式
- 設計模式之策略模式和狀態模式(strategy pattern & state pattern)設計模式
- 簡單工廠模式( Simple Factory Pattern )模式
- 建立型模式-單例模式-工廠模式模式單例
- 設計模式(四)Singleton設計模式設計模式
- 一天一個設計模式(二) - 單例模式(Singleton)設計模式單例
- 建立者模式之單例模式模式單例
- 《Head First 設計模式》:單件模式設計模式
- Python單例模式(Singleton)的N種實現Python單例模式
- 【大道模式】享元模式-FlyWeight Pattern模式
- Java設計模式——單例模式(建立型模式)Java設計模式單例