1. 程式人生 > >單例模式的三種寫法和優缺點

單例模式的三種寫法和優缺點

兩種 system 一個 obj cti sin clr 效果 returns

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace ConsoleApp1
 5 {
 6     class Singleton
 7     {
 8         private static Singleton _singleton = null;
 9         private static object singleton_Lock = new object();  //對象鎖
10 
11         /// <summary>
12         /// 標準的單例模式
13         ///
</summary> 14 /// <returns></returns> 15 public static Singleton CreateInstance() 16 { 17 if (_singleton == null)//保證對象初始化化之後的所有線程,不需要等待鎖 18 { 19 lock (singleton_Lock)//保證只有一個線程進去判斷 20 { 21 if
(_singleton == null)//保證對象為空才創建 22 { 23 _singleton = new Singleton(); 24 } 25 } 26 } 27 return _singleton; 28 } 29 }//Class_end 30 }

第一種單例的寫法,是用兩個if加一個Lock來優化在多線程情況下調用單例的耗時,而下面是第二種寫法(下圖),效果一樣,但更加簡單

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace ConsoleApp1
 5 {
 6     class Singleton
 7     {
 8         private static Singleton _Singleton = null;
 9 
10         /// <summary>
11         /// 靜態構造函數:由CLR保證,在第一次調用之前調用,只調用一次
12         /// </summary>
13         static Singleton()
14         {
15             _Singleton = new Singleton();
16         }
17 
18         public static Singleton CreateInstance()
19         {
20             return _Singleton;
21         }
22       }//Class_end
23 }
第三種單例的寫法更簡單,直接在聲明靜態變量的時候創建實例化類
 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace ConsoleApp1
 5 {
 6     class Singleton
 7     {
 8         //靜態變量會在類型第一次使用的時候初始化,而且只初始化一次
 9         private static Singleton _singleton = new Singleton();
10         public static Singleton CreateInstance()
11         {
12             return _singleton;
13         }
14       }//class_end
15 }
這三種單例的寫法,其實效果都一樣,只是後面兩種是由系統CLR幫我們調用創建實例類。
單例的優點是:保證整個進程中該對象只被實例化一次,減少性能消耗
缺點是:常駐內存,不會被GC回收(普通類型需要的時候就初始化,用完被GC自動回收),而且過多使用單例,而單例類本身帶有公有變量,就會很容易造成嚴重的問題

單例模式的三種寫法和優缺點