C#中的單例模式
阿新 • • 發佈:2018-12-26
單例模式現在有二種,第一個是餓漢模式,第二個是懶漢模式。筆者將去實現這2個例子,然後分析它們的優缺點。
1.餓漢模式
using System; namespace DesignMode { class SingletonMode { public static SingletonMode instance { get; private set; } = null; private SingletonMode() { Console.WriteLine("建構函式"); } static SingletonMode()///Clr執行的時候,進行初始化,並且只執行一次 { instance = new SingletonMode(); } public void Print() { Console.WriteLine("Hello World!!"); } } } |
個人比較推薦餓漢模式,因為在Clr執行的時候,進行初始化,並且只執行一次,不用管什麼多執行緒之類的問題,也不用擔心效能問題,因為在最開始的時候不管你要不要這個例項,都會被創建出來,所以只是在程式開始的時候消耗時間,到程式結束前不會銷燬。
2.懶漢模式
using System; namespace DesignMode { class SingletonMode { private static bool IsState = false; private static object Singleton_Lock = new object(); public static SingletonMode _instance = null; private SingletonMode() { lock(Singleton_Lock) { if (IsState == false) { Console.WriteLine("建構函式"); IsState = true; } else { Console.WriteLine("構造已經完成"); } } } public static SingletonMode CreateInstance() { if (_instance == null) { lock (Singleton_Lock)//執行緒鎖 { if (_instance == null) { _instance = new SingletonMode(); } } } return _instance; } public void Print() { Console.WriteLine("Hello World!!"); } } } |
懶漢模式筆者是不太推薦的,當這個類的例項需要的是才會創建出來,呼叫CreateInstance這個函式去建立,這裡有個經典的問題為什麼是雙層判斷,其實第一層判斷去掉也沒有錯誤,只是效能上的問題,比如我在一個地方第二次呼叫了CreateInstance,它會直接去判斷,而不是去競爭這個鎖,筆者將畫一個圖詳細介紹一下餓漢模式。
所以總結一下餓漢模式是開始執行程式時就建立例項,我們使用的是靜態儲存的物件,而懶漢模式是需要的時候在棧上建立物件去使用。