單例模式能夠簡單理解爲一個類只有一個實例化,並提供全局的訪問點。多線程
舉個例子,在操做系統中,任務管理器只能存在一個,對吧。那麼接下來的事情就是簡單的實現單例模式了。函數
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Singleton 7 { 8 public class Singleton 9 { 10 //使用靜態變量保存類的實例 11 private static Singleton uniqueInstance; 12 13 //私有構造 14 private Singleton() 15 { 16 } 17 18 /// <summary> 19 /// 全局訪問點 20 /// </summary> 21 /// <returns></returns> 22 public static Singleton GetInstance() 23 { 24 if (uniqueInstance==null) 25 { 26 Console.WriteLine("實例化 單例模式."); 27 uniqueInstance = new Singleton(); 28 } 29 else 30 { 31 Console.WriteLine("返回 單例模式"); 32 } 33 return uniqueInstance; 34 } 35 36 } 37 38 39 class Program 40 { 41 static void Main(string[] args) 42 { 43 Singleton.GetInstance(); 44 Singleton.GetInstance(); 45 } 46 } 47 }
只有在該類中使用,不能被外界訪問。也就是說,該類不能經過外界 new操做 實例化一個對象。而只能在本類中實例化。this
靜態變量是在堆分配的,而普通變量是在棧上分配的,也就是說它的生存期爲整個源程序。spa
靜態成員函數不能夠調用類的非靜態成員。由於靜態成員函數不含this指針。 這裏,咱們使用靜態函數訪問靜態變量。操作系統
在上訴代碼中,若是是多線程的狀況,頗有可能會建立多個實例化。可是咱們想要的是,只要第一次建立該實例,其餘狀況都返回該實例。咱們的解決方案是採用線程加鎖的方式。線程
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Singleton 7 { 8 public class Singleton 9 { 10 //使用靜態變量保存類的實例 11 private static Singleton uniqueInstance; 12 13 //私有構造 14 private Singleton() 15 { 16 } 17 18 19 //線程鎖 20 private static readonly object locker = new object(); 21 22 /// <summary> 23 /// 全局訪問點 24 /// </summary> 25 /// <returns></returns> 26 public static Singleton GetInstance() 27 { 28 if (uniqueInstance==null) 29 { 30 lock (locker) 31 { 32 if (uniqueInstance == null) 33 { 34 Console.WriteLine("實例化 單例模式."); 35 uniqueInstance = new Singleton(); 36 } 37 } 38 } 39 else 40 { 41 Console.WriteLine("返回 單例模式"); 42 } 43 return uniqueInstance; 44 } 45 46 } 47 48 49 class Program 50 { 51 static void Main(string[] args) 52 { 53 Singleton.GetInstance(); 54 Singleton.GetInstance(); 55 } 56 } 57 }