1、基本概述設計模式
單件模式:確保一個類只有一個實例,並提供一個全局訪問點。安全
解析以下:ide
1)首先,該Singleton的構造函數必須是私有的,以保證客戶程序不會經過new()操做產生一個實例,達到實現單例的目的;函數
2)由於靜態變量的生命週期跟整個應用程序的生命週期是同樣的,因此能夠定義一個私有的靜態全局變量uniqueInstance來保存該類的惟一實例;性能
3)必須提供一個全局函數訪問得到該實例。spa
以下圖結構說明圖:線程
2、詳細說明設計
單件模式的建立,有三種方式。code
問:難道我不能建立一個類,把全部的方法和變量都定義爲靜態的,把類直接看成一個單件?對象
答:若是你的類自給自足,並且不依賴於複雜的初始化,那麼你能夠這麼作。可是,由於靜態初始化的控制權是在CLR手上,這麼作有可能致使混亂,特別是當有許多類牽涉其中的時候。這麼作經常會形成一些微妙的、不容易發現的和初始化的次序有關的bug。除非你有絕對的必要使用類的單件,不然仍是建議使用對象的單件,比較保險。
問:我仍是不瞭解爲什麼全局變量比單件模式差。
答:在.Net中,全局變量基本上就是對對象的靜態引用。在這樣的狀況下使用全局變量會有一些缺點,咱們已經提到了其中的一個,急切實例化VS延遲實例化。可是咱們要記住這個模式的目的,確保類只有一個實例並提供全局訪問。全局變量能夠提供全局訪問,可是不能確保只有一個實例。
3、代碼列表
public class Singleton { //其餘有用的單件數據 private Singleton() { } //方式一:經典方式 /*private static Singleton uniqueInstance; public static Singleton GetInstance() { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; }*/ //方式二:急切方式 /*private static Singleton uniqueInstance = new Singleton(); public static Singleton GetInstance() { return uniqueInstance; }*/ //方式三:雙重檢查加鎖方式 /*private static Singleton uniqueInstance; public static Singleton GetInstance() { if (uniqueInstance == null) { lock (uniqueInstance) { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; //Interlocked類爲多個線程共享的變量提供原子操做。 //CompareExchange方法比較兩個對象是否相等,若是相等,則替換其中一個對象。 //return Interlocked.CompareExchange(ref uniqueInstance, new Singleton(), null); }*/ //其餘有用的單件方法 }
---------------------------------以上內容根據《Head First 設計模式》進行整理