建立型設計模式之單例
建立型設計模式關注類怎麼建立(例項化)
單例模式:就是一個程序中只有一個例項。為啥要用單例,很多人誤解他的使用條件。單例是這個類例項化很消耗資源,而且頻繁使用,就用單例模式。當我是小小白時,就只是以為呼叫裡面的方法、屬性操作很方便!還有人誤解為多執行緒才用單例。單例也不是越多越好。因為這個例項是靜態的。程序結束後才會銷燬資源,所以你單例用多了,很多資源不是交給GC去回收。導致資源浪費!!
C#單例模式:餓漢式、懶漢式單例模式
先說餓漢式:也就是第一次呼叫的時候才建立
首先第一個條件:一個程序只有一個例項,怎麼保證!那就是不能被外面隨便new()。所以類內部是私有的建構函式。
public classSingleton { private Sington() { } private static Singleton _Singleton = null; private static object Singleton_Lock = new object(); //鎖同步 public static Singleton CreateInstance() { lock (Singleton_Lock) { if (_Singleton == null) { _Singleton = newSingleton(); } } return _Singleton; } }
那為啥要用lock。因為怕多執行緒來了同時建立幾個例項,也就不能保證單例了。
那為啥要兩個if判斷呢。這樣想,第一次請求性併發2個以上的執行緒,同時走到第一個if裡面。然後lock裡面進去一個執行緒,然後在if判斷,才開始建立例項。然後走出去,然後lock前面的第二個執行緒進去lock程式碼,如果不加這個if判斷,是不是會重新new(),就不是一次例項了,所以要雙if判斷。
餓漢式:就是程式一啟動就建立好了。不需要用的時候才new。餓漢嘛,比較積極!
1 publicView Codeclass Singleton 2 { 3 private static Singleton _Singleton = null; 4 5 static Singleton() 6 { 7 8 _Singleton = new Singleton(); 9 } 10 11 public static Singleton CreateInstance() 12 { 13 return _Singleton; 14 } 15 }
靜態建構函式,程式啟動時,由CLR建立,所以比較積極,你用沒用,他都已經被建立了。
還有靜態的變數實現單例,和上面同理,也是餓漢式的
1 public sealed class Singleton 2 { 3 private Singleton() { } 4 5 private static readonly Singleton singleInstance = new Singleton(); 6 7 public static Singleton GetInstance 8 { 9 get 10 { 11 return singleInstance; 12 } 13 } 14 }View Code
單例模式中的延遲載入
延遲載入或延遲載入是一種設計模式,或者您可以說這是一個概念,通常用於將物件的初始化延遲到需要時。因此,延遲載入的主要目標是按需載入物件,或者您可以根據需要說出物件。
作為 .NET Framework 4.0 的一部分引入的惰性關鍵字為惰性初始化(即按需物件初始化)提供了內建支援。如果要使物件(如 Singleton)以延遲初始化,則只需將物件的型別(單例)傳遞給lazy關鍵字,如下所示。
1 public sealed class Singleton 2 { 3 private Singleton() 4 {} 5 6 private static readonly Lazy<Singleton> Instancelock = 7 new Lazy<Singleton>(() => new Singleton()); 8 9 public static Singleton GetInstance 10 { 11 get 12 { 13 return Instancelock.Value; 14 } 15 } 16 }View Code