一:模式分類設計模式
從目的來看:多線程
建立型(Creational)模式:負責對象建立。框架
結構型(Structural)模式:處理類與對象間的組合。優化
行爲型(Behavioral)模式:類與對象交互中的職責分配。spa
從範圍來看:線程
類模式處理類與子類的靜態關係。設計
對象模式處理對象間的動態關係。code
二:Singleton (建立型模式) 單件對象
1.動機(Motivation)blog
軟件系統中,常常有這樣一些特殊的類,必須保證他們在系統中只存在一個實例,才能確保它們的邏輯正確性,以及良好的效率。
如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例 ?
這應該是類設計者的責任,而不是使用者的責任。
2.意圖(Intent)
保證一個類僅有一個實例,並提供一個該實例的全局訪問點。 ——《設計模式》 GOF
3.結構(Structure)
三:實現
1.單線程Singleton模式實現
1.2單線程Singleton幾個要點:
Singleton模式中的實例構造器能夠設置爲protected以容許子類派生。
Singleton模式通常不要支持Icloneable接口,由於這可能致使多個實例對象,與Singleton模式初衷違背。
Singleton模式通常不要支持序列化,由於這可能致使多個實例對象,與Singleton模式初衷違背。
Singleton模式只考慮對象建立的管理,沒有考慮對象銷燬的管理,就支持垃圾回收的平臺和對象的開銷來說,咱們沒有必要對其銷燬進行管理特殊管理。
不能應對多線程狀況,在多線程環境下仍有可能出現多個對象實例。
public class MySigleton_SingleProcess { private static MySigleton_SingleProcess instance; private MySigleton_SingleProcess() { } public static MySigleton_SingleProcess GetMySingletonInstance() { if(instance==null){ instance = new MySigleton_SingleProcess(); } return instance; } }
2.多線程Singleton模式實現
public class MySigleton_MultiProcess { private static MySigleton_MultiProcess instance; private static readonly object lockHelper=new object(); private MySigleton_MultiProcess() { } public static MySigleton_MultiProcess GetMySingletonInstance() { if (instance == null) { lock (lockHelper) { //double check 預防代碼編譯的時候做出優化調整了代碼執行順序 if (instance == null) { instance = new MySigleton_MultiProcess(); } } } return instance; } }
3.使用.NET初始化機制實現多線程Singleton模式
public class Singleton { private static readonly Singleton _instance = new Singleton(); // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Singleton() { } /// <summary> /// Prevents a default instance of the /// <see cref="Singleton"/> class from being created. /// </summary> private Singleton() { } /// <summary> /// Gets the instance. /// </summary> public static Singleton Instance { get { return _instance; } } }
4.Singleton 模式擴展
將一個實例擴展到多個實例,好比對象池的實現。
將New構造器的調用轉移到其餘類中,例如多個類協同工做環境中,某個局部環境只須要擁有某個類的一個實例。
Singleton 模式核心是「如何控制用戶使用new對一個類的實例構造器的任意調用」。
5. .NET框架中Singleton模式的應用
Object 基類中的 GetType() 。