1、單例模式(建立型模式)安全
2、動機:多線程
在軟件系統中,常常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。性能
§如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例?spa
這應該是類設計者的責任,而不是使用者的責任線程
3、意圖:設計
保證一個類僅有一個實例,並提供一個該實例的全局訪問點。對象
4、實現:接口
(01)get
public sealed class Singletonclass
{
static Singleton instance = null;
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
注意:
對於線程來講不安全
單線程中已知足要求
優勢:
因爲實例是在 Instance 屬性方法內部建立的,所以類可使用附加功能
直到對象要求產生一個實例才執行實例化;這種方法稱爲「惰性實例化」。惰性實例化避免了在應用程序啓動時實例化沒必要要的 singleton。
(02)
public sealed class Singleton
{
private static Singleton instance = null;
private static readonly object padlock = new object();
private Singleton()
{
}
public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
}
return instance;
}
}
}
注意:
同一個時刻加了鎖的那部分程序只有一個線程能夠進入
對象實例由最早進入的那個線程建立
後來的線程在進入時(instence == null)爲假,不會再去建立對象實例
增長了額外的開銷,損失了性能
(03)
public sealed class Singleton
{
private static Singleton instance = null;
private static readonly object padlock = new object();
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
注意:
多線程安全
線程不是每次都加鎖
容許實例化延遲到第一次訪問對象時發生
(04)
public sealed class Singleton
{
private static readonly Singleton instance =null;
static Singleton()
{
instance = new Singleton();
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
注意:
依賴公共語言運行庫負責處理變量初始化
公共靜態屬性爲訪問實例提供了一個全局訪問點
對實例化機制的控制權較少(.NET代爲實現)
靜態初始化是在 .NET 中實現 Singleton 的首選方法
(05)
public sealed class Singleton
{
private Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
private class Nested
{
static Nested()
{
instance= new Singleton();
}
internal static readonly Singleton instance=null;
}
}
注意:初始化工做由Nested類的一個靜態成員來完成,這樣就實現了延遲初始化
五:注意事項:
Singleton模式中的實例構造器能夠設置爲protected以容許子類派生。
Singleton模式通常不要支持ICloneable接口,由於這可能會致使多個對象實例,與Singleton模式的初衷違背。
Singleton模式通常不要支持序列化,由於這也有可能致使多個對象實例,一樣與Singleton模式的初衷違背。
Singletom模式只考慮到了對象建立的管理,沒有考慮對象銷燬的管理。就支持垃圾回收的平臺和對象的開銷來說,咱們通常沒有必要對其銷燬進行特殊的管理。
Singleton模式是限制而不是改進類的建立。
理解和擴展Singleton模式的核心是「如何控制用戶使用new對一個類的構造器的任意調用」。
能夠很簡單的修改一個Singleton,使它有少數幾個實例,這樣作是容許的並且是有意義的。