這個模式好像經常有人拿來談論,我覺得理論意義比實際意義要大,所以列出三種寫法,看著玩兒吧.
1. 普通寫法
using System;
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
優點有 1. 可以擴充, 繼承個子類之類的. 2. 在需要的時候才會執行個體化對象. 缺點就是不是安全執行緒.
2. 簡便寫法
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
private Singleton(){}
public static Singleton Instance
{
get
{
return instance;
}
}
}
這種最簡單直接了, 並且這也是訪問的時候才會執行個體化. 要說劣勢,那就是只能用預設的建構函式,不能加什麼其他的操作.
3. 普遍實現方式
using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
volatile 關鍵字很重要,多線程時候, 使用這個變數時候會重新得到實際的記憶體變數,就不會訪問緩衝中的數值.