C#設計模式--單例模式


0.C#設計模式-簡單工廠模式

1.C#設計模式--工廠方法模式

2.C#設計模式--抽象工廠模式

設計模式:

單例模式(Singleton Pattern)

單例模式簡單介紹

單例模式的特點:

  • 單例類只能有一個實例。
  • 單例類必須自己創建自己的唯一實例。
  • 單例類必須給所有其它對象提供這一實例。

單例模式類圖:

 

單例模式c#代碼舉例,分別用三種常見的單例模式舉例

單例模式1 線程不安全

在多線程的環境下有可能得到Singleton類的多個實例

 1     /// <summary>
 2     /// 單例模式1,線程不安全
 3     /// </summary>
 4     public class Singleton
 5     {
 6         private static Singleton _instance = null;
 7 
 8         /// <summary>
 9         /// 構造方法私有,防止實例化
10         /// </summary>
11         private Singleton() { }
12         public static Singleton Instance
13         {
14             get 
15             { 
16                 return _instance ?? (_instance = new Singleton()); //??表示,如果_instance為null 則執行后面括號中的
17             }
18         }
19     }

單例模式2 線程安全

需要創建了一個靜態只讀的進程輔助對象_instanceLock ,由於lock是確保當一個線程位於代碼的臨界區時,另一個線程不能進入臨界區(同步操作)。如果其他線程試圖進入鎖定的代碼,則它將一直等待,直到該對象被釋放。從而確保在多線程下不會創建多個對象實例了。只是這種實現方式要進行同步操作,這將是影響系統性能的瓶頸和增加了額外的開銷(只是針對系本身開銷比較大的情況,一般情況下,這樣是可以的,如果說對系統性能要求極高,最好采用第三種方式)

 1    /// <summary>
 2     /// 單例模式2,線程安全
 3     /// </summary>
 4     public class Singleton
 5     {
 6         private static Singleton _instance = null;
 7         private static readonly object _instanceLock = new object();
 8         private Singleton() { }
 9         public static Singleton Instance
10         {
11             get
12             {
13                 lock (_instanceLock)
14                 {
15                     return _instance ?? (_instance = new Singleton());
16                 }
17             }
18         }
19     }

單例模式3:線程安全(建議用這種方式)

在同步操作之前,添加判斷該實例_instance是否為null就可以降低通過操作的次數了,提高系統的性能

 1     /// <summary>
 2     /// 單例模式3:線程安全(建議用這種方式)
 3     /// </summary>
 4     public class Singleton
 5     {
 6         private static Singleton _instance = null;
 7         private static readonly object _instanceLock = new object();
 8         private Singleton() { }
 9         public static Singleton Instance
10         {
11             get
12             {
13                 if (null == _instance)
14                 {
15                     lock (_instanceLock)
16                     {
17                         if (null == _instance)
18                         {
19                             _instance = new Singleton();
20                         }
21                     }
22                 }
23                 return _instance;
24             }
25         }
26     }

單例模式測試代碼:

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Singleton singleton1 = Singleton.Instance;
 6             Singleton singleton2 = Singleton.Instance;
 7            
 8             if (singleton1 == singleton2)
 9             {
10                 Console.WriteLine("ok");
11             }
12             else
13             {
14                 Console.WriteLine("no");
15             }
16             Console.Read();
17         }
18     }

運行結果

源代碼工程文件下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM