系列文章
[Head First設計模式]山西面館中的設計模式——裝飾者模式
[Head First設計模式]山西面館中的設計模式——觀察者模式
[Head First設計模式]山西面館中的設計模式——建造者模式
[Head First設計模式]餃子館(冬至)中的設計模式——工廠模式
引言
已經不想再數這是第多少個一個人的平安夜了,一個人走在路上,發現滿腦子的技術問題,也許,在技術中才能找到一點安慰吧。很多朋友一直問我,為什么那么拼,lz只是覺得“如果連自己喜歡的工作,都做不好,那么活着就太空虛了,男人么就應該對自己恨一點。如果你現在沒有得到你想要的生活,只能說明你對自己還不夠狠”。言歸正傳,說說今天的單例模式。
單例模式定義
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
大家都知道“一夫一妻制”,在中國,一個男人,有且只能有一個媳婦,如果你非要找個小三,勢必會增加開銷,占用更多資源。所以沒資本的屌絲們,勸你們,媳婦這個對象有且只能創建一個,如果你不自量力,非要整個小三出來,像某某官員,一般不會出問題,但當小三和你媳婦爭奪資源的時,勢必會出現致命性的bug,信不信由你?
單例模式類圖

(類圖來自:http://www.cnblogs.com/zhili/p/SingletonPatterm.html,這里借用一下)
實現單例模式條件
通過觀察上面類圖可知:
1.靜態的私有化字段;
private static readonly Singleton uniqueInstance = new Singleton();
2.私有構造器
private Singleton(){ }
3.提供公共的訪問該類實例的方法.
1 public static Singleton GetInstance() 2 { 3 return uniqueInstance; 4 }
常見的單例模式
一,餓漢式
1 public sealed class Singleton 2 { 3 #region 餓漢式 4 private static readonly Singleton uniqueInstance = new Singleton(); 5 private Singleton() { } 6 public static Singleton GetInstance() 7 { 8 return uniqueInstance; 9 } 10 #endregion 11 }
優點:
1.線程安全
2.在類加載的同時已經創建好一個靜態對象,調用時反應速度快。
3.通過sealed修飾類,阻止派生類的出現,因為派生可能會增加實例。
缺點:
資源效率不高,可能GetInstance()永遠不會執行到,但執行該類的其他靜態方法或者加載了該類(class.forName),那么這個實例仍然初始化。
二,懶漢式
1 public sealed class Singleton 2 { 3 private static Singleton instance; 4 //程序運行時創建一個靜態的只讀對象 5 private static readonly object o = new object(); 6 private Singleton() { } 7 public static Singleton GetInstance() 8 { 9 //雙重鎖 10 //先判斷實例是否存在,不存在再加鎖處理 11 //這樣不用讓線程每次都加鎖,保證了線程安全,也提高了性能 12 if (instance == null) 13 { 14 //保證只有一個線程 15 lock (o) 16 { 17 ///若實例不存在,則new一個新實例,否則返回已有的實例 18 if (instance == null) 19 { 20 instance = new Singleton(); 21 } 22 } 23 } 24 return instance; 25 } 26 }
懶漢式面臨線程安全的問題,通過雙重鎖定這樣的處理才可以保證安全。
測試
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Singleton singleton1 = Singleton.GetInstance(); 6 Singleton singleton2 = Singleton.GetInstance(); 7 if (singleton1==singleton2) 8 { 9 Console.WriteLine("兩個對象一樣"); 10 } 11 Console.Read(); 12 } 13 }
結果
本打算創建個對象,給我買個蘋果的,看來兩個對象一樣,也只能自己給自己買了。
總結
單例模式(Singleton),保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
