[Head First設計模式]山西面館中的設計模式——裝飾者模式html
[Head First設計模式]山西面館中的設計模式——觀察者模式web
[Head First設計模式]山西面館中的設計模式——建造者模式設計模式
[Head First設計模式]餃子館(冬至)中的設計模式——工廠模式安全
已經不想再數這是第多少個一我的的平安夜了,一我的走在路上,發現滿腦子的技術問題,也許,在技術中才能找到一點安慰吧。不少朋友一直問我,爲何那麼拼,lz只是以爲「若是連本身喜歡的工做,都作很差,那麼活着就太空虛了,男人麼就應該對本身恨一點。若是你如今沒有獲得你想要的生活,只能說明你對本身還不夠狠」。言歸正傳,說說今天的單例模式。post
單例模式是一種經常使用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例類的特殊類。經過單例模式能夠保證系統中一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。若是但願在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。性能
你們都知道「一夫一妻制」,在中國,一個男人,有且只能有一個媳婦,若是你非要找個小三,勢必會增長開銷,佔用更多資源。因此沒資本的屌絲們,勸大家,媳婦這個對象有且只能建立一個,若是你蚍蜉撼樹,非要整個小三出來,像某某官員,通常不會出問題,但當小三和你媳婦爭奪資源的時,勢必會出現致命性的bug,信不信由你?測試
(類圖來自:http://www.cnblogs.com/zhili/p/SingletonPatterm.html,這裏借用一下)url
經過觀察上面類圖可知:spa
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),保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。