模式說明:函數
保證每個類僅有一個實例,並提供一個訪問它的全局訪問點(即自行實例化並向整個系統提供這個實例)。spa
應用場景:code
1.如配置文件取值類AppConfig(自己實例化對象比較大,且沒有必要實例化多個)對象
每個AppConfig實例對象都封裝着配置文件的內容,若是系統中有多個AppConfig實例對象,系統中就會同時存在多份配置文件的內容,這樣會嚴重浪費內存資源。若是配置文件內容比較多,多個實例對於系統資源的浪費就會更大。事實上,對於AppConfig這種類,在運行期間,一個實例對象就足夠了。 內存
2.如交易匹配類TradeMatchCore(單個類中須要共享成員變量,多個實例沒法作到)資源
交易匹配類TradeMatchCore,負責系統交易和外部交易的匹配,調用該方法的場景有,a.定時服務 b.客戶端手工調用 c.交易成交確認後自動調用。it
而該類維護了一個成員變量_maxID,標記上次匹配成功的外部交易的最大ID。若是每一個調用地方都實例化一個TradeMatchCore對象,即每一個對象都維護了一個單獨的_maxID值,若是上述三個地方的該值不一致,就會對匹配照成問題。class
模式應用:變量
單例模式有兩種實現方式,一種稱爲懶漢式,一個爲餓漢式。配置
a.懶漢式的實現邏輯爲:
在聲明對象實例的時候不着急,會一直等到立刻要使用對象實例的時候纔會建立。懶人,老是在無可奈何的時候纔會去作這件事情,在裝載對象的時候不會立刻建立對象實例。
class LazySingleton { //4.定義惟一實例的成員變量 //5.因爲該實例須要在Static方法中使用,將其定義爲static private static LazySingleton _lazySingleton; //1.將構造函數私有化,以防外面示例化該對象 private LazySingleton() { } //2.對外公開一個全局訪問點(public) //3.因爲外面不能經過new LazySingleton()來調用該方法(這樣就違背單例原則),所以將該方法定義爲static public static LazySingleton GetSingleton() { //6.爲防止同時兩個用戶同時調用,裏面使用鎖機制。在鎖裏面第一句話也要判斷_lazySingleton是否爲空 if (_lazySingleton != null) return _lazySingleton; lock(typeof(LazySingleton)) { if (_lazySingleton != null) return _lazySingleton; _lazySingleton = new LazySingleton(); return _lazySingleton; } } }
b.餓漢式的實現邏輯爲:
class HungrySingleton { //4.定義staitc形式的惟一實例的成員變量,而且實例化 private static HungrySingleton _hungrySingleton = new HungrySingleton(); //1.將構造函數私有化,以防外面示例化該對象 private HungrySingleton() { } //2.對外公開一個全局訪問點(public) //3.因爲外面不能經過new LazySingleton()來調用該方法(這樣就違背單例原則),所以將該方法定義爲static public static HungrySingleton GetSingleton() { //5.直接返回static形式的已經實例化好的成員變量 return _hungrySingleton; } }
c.餓漢式和懶漢式的區別爲(後續補充順序示意圖)
懶漢式單例模式,體現了延遲加載的思想,即一開始不加載資源或者數據,一直等,等到立刻就要使用這個資源或者數據了,躲不過去了才加載,也稱爲Lazy Load.懶漢式是典型的以時間換空間。
餓漢式在類加載的時候就會建立類實例,無論你用不用,先建立出來,而後每次調用的時候就不用再判斷了,節省了容許時間。
餓漢式是典型的以空間換時間。