>>回傳《C#常用設計模式》
- 1. 簡介
- 2. 示例
- 2.1. 最常見的單例模式
- 2.2. 執行緒安全的單例模式
- 2.3. 執行緒安全且簡練的單例模式
- 2.4. 含引數的單例模式
1. 簡介
定義:
保證一個類僅有一個實體,并提供一個該實體的全域訪問點,
注意:
- 單例模型下實體化操作應該是類的設計者的責任,而不是使用者的責任,
- 在該類中直接提供實體化的方法,保證實體唯一
2. 示例
2.1. 最常見的單例模式
public class Singleton
{
//保存實體容器
private static Singleton instance = null;
//取消默認的public的預設構造器
private Singleton() { }
//實體的出口
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
2.2. 執行緒安全的單例模式
public class Singleton
{
//volatile 它是被設計用來修飾被不同執行緒訪問和修改的變數,
//如果沒有volatile,基本上會導致這樣的結果:
//要么無法撰寫多執行緒程式,要么編譯器失去大量優化的機會,
//volatile的作用: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.
private static volatile Singleton instance = null;
private static object lockHelper = new object();
//取消默認的public的構造器
private Singleton() { }
//實體的出口
public static Singleton Instance
{
get
{
//double check 前面的判斷是為了減少后面判斷的訪問,因為后面的判斷會阻塞并發執行緒
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
2.3. 執行緒安全且簡練的單例模式
利用了靜態構造方法是執行緒安全的,
缺點: 不接受引數
public class Singleton
{
public static readonly Singleton Instance = new Singleton();
private Singleton() { }
}
等價于
public class Singleton
{
public static readonly Singleton Instance;
static Singleton()
{
Instance = new Singleton();
}
private Singleton() { }
}
說明:
- 靜態構造器執行時間:在靜態欄位初始化之前執行,
- 行內初始化編譯后會將初始化的內容放到靜態構造器內部執行
- 靜態構造器只能被一個執行緒執行一次,不可能被多執行緒執行
2.4. 含引數的單例模式
一般情況下用不到,
public class Singleton
{
//保存實體容器
private static Singleton instance;
//取消默認的public的構造器
private Singleton(int x,int y)
{
this.x = x;
this.y = y;
}
//實體的出口
public static Singleton GetInstance(int x, int y)
{
if (instance == null)
{
instance = new Singleton(x,y);
}
else
{
instance.x = x;
instance.y = y;
}
return instance;
}
private int x;
private int y;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/258355.html
標籤:其他
上一篇:C#常用設計模式
