3、意圖(Intent)
保證一個類僅有一個實例,並提供一個該實例的全局訪問點。
——《設計模式》GoF設計模式
4、單線程Singleton模式實現
public class Singleton
{
private static Singleton _instance;
//重點在這,私有構造,不讓外部new
private Singleton()
{
}
public static Singletoon Instance
{
get
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
}多線程
class Test
{
public static void Main()
{
Singleton t1 = Singleton.Instance;
Singleton t2 = Singleton.Instance;
//查看t1, t2的引用是否相等
Console.WriteLine(Object.ReferenceEquals(t1, t2) == true);
}
}編輯器
5、單線程Singleton模式的幾個要點
1)Singleton模式中的實例構造器能夠設置爲protected以容許子類派生。
2)Singleton模式通常不要支持ICloneable接口,由於這能夠會致使多個對象實例,與Singleton模式的初衷違背。由於IClonealbe是克隆淺拷鋇。
3)Singleton模式通常不要支持序列化,由於這也有可能致使多個對象實例,一樣與Singleton模式初衷違背。序列化能實現克隆的深拷鋇。
4)Singleton模式只考慮到了對象建立的管理,沒有考慮對象銷燬的管理。就支持垃圾回收的平臺和對象的開銷來說,咱們通常沒有必要 對其銷燬進行特殊的管理。
5)不能應對多線程環境:在多線程環境下,使用Singleton模式仍然有可能獲得Singleton類的多個實例對象。
6、多線程單件
1)第一實現方法
public class Singleton
{
/* 關鍵字volatile保證嚴格意義的多線程不會出現微調,嚴格按順序執行,
若是刪除關鍵字volatile,編輯器有可能對代碼進行微調,仍是有可能出現new屢次的狀況*/
private static volatile Singleton _instance = null;
// 輔助器,本向不參與真正意義的構建
private static object _lockHelper = new Object();
private Singleton()
{
}
// 沒有參數時使用靜態屬性,有參數時應使用方法GetInstance
public static Singleton Instance
{
get
{
if (_instance == null)
{
lock (_lockHelper) // 鎖住_lockHelper,避免多線程的訪問
{
if (instance == null)//雙檢查
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
// 帶參數的實現以下
private int x;
private int y;
private Singleton(int x, int y)
{
this.x = x;
this.y = y;
}
public Singleton GetInstance(int x, int y)
{
if (_instance == null)
{
_instance = new Singleton(x, y);
}
else
{
_instance.x = x;
_instance.y = y;
}
return _instance;
}
}
2)第二種實現方法:不支持參數化的構造
//sealed須要不須要看實際狀況
sealed class Singleton
{
//類連初始化,實際上會在靜態構造器裏面初始化
public static readonly Singleton Instance = new Singleton();
private int _X;
private int _Y;
private Singleton()
{
}
public void Init(FileStream fs)
{
}
public int X
{
get
{
return _X;
}
set
{
this._X = value;
}
}
public int Y
{
get
{
return _Y;
}
set
{
this._Y = value;
}
}
}this
上面的方法等同於下面的方法
sealed class Singleton
{
public static readonly Singleton Instance;
//靜態構造器,只在靜態字段初始化前初始化
static Singleton()
{
Instance = new Singleton();
}
private Singleton()
{
}
}線程
class Test
{
public static void Main()
{
singleton instance = Singleton.Instance;
instance.Init(new FileStream("..."));
instance.X = 100;
instance.Y = 200;
Console.WriteLine(instance);
}
}設計
7、Singleton模式擴展
1)Singleton模式是對建立對象個數的控制。將一個實例擴展到n個實例,例如對象池的實現。建立n個實例放入到集合對象中,供用戶使用,達到資源的有效管理。
2)將new構造的調用轉移到其餘類中,例如多個類協同工做環境中,某個局部環境只須要擁有某個類的一個實例。
3)理解和擴展Singleton模式的核心是「如何控制用戶使用new對一個類的實例構造器的任意調用」。
對象