1. 程式人生 > 其它 >建立型設計模式之單例

建立型設計模式之單例

建立型設計模式關注類怎麼建立(例項化)

單例模式:就是一個程序中只有一個例項。為啥要用單例,很多人誤解他的使用條件。單例是這個類例項化很消耗資源,而且頻繁使用,就用單例模式。當我是小小白時,就只是以為呼叫裡面的方法、屬性操作很方便!還有人誤解為多執行緒才用單例。單例也不是越多越好。因為這個例項是靜態的。程序結束後才會銷燬資源,所以你單例用多了,很多資源不是交給GC去回收。導致資源浪費!!

C#單例模式:餓漢式、懶漢式單例模式

先說餓漢式:也就是第一次呼叫的時候才建立

首先第一個條件:一個程序只有一個例項,怎麼保證!那就是不能被外面隨便new()。所以類內部是私有的建構函式。

public class
Singleton {    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 = new
Singleton();     }     }       return _Singleton;     } }

那為啥要用lock。因為怕多執行緒來了同時建立幾個例項,也就不能保證單例了。

那為啥要兩個if判斷呢。這樣想,第一次請求性併發2個以上的執行緒,同時走到第一個if裡面。然後lock裡面進去一個執行緒,然後在if判斷,才開始建立例項。然後走出去,然後lock前面的第二個執行緒進去lock程式碼,如果不加這個if判斷,是不是會重新new(),就不是一次例項了,所以要雙if判斷。

餓漢式:就是程式一啟動就建立好了。不需要用的時候才new。餓漢嘛,比較積極!

 1 public
class 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 }
View Code

靜態建構函式,程式啟動時,由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