單例模式, 顧名思義, 就是共用同一個實體對象. 對於共用, 首先想到的就是static靜態變數, 那麼怎麼使用static去實現單例呢. 一、單線程單例模式 由於這個模式的實現還是比較簡單的, 所以直接上代碼.(不推薦使用此方式) 私有化構造函數之後, 外部就不能通過new A()的方式來實例化A ...
單例模式, 顧名思義, 就是共用同一個實體對象.
對於共用, 首先想到的就是static靜態變數, 那麼怎麼使用static去實現單例呢.
一、單線程單例模式
由於這個模式的實現還是比較簡單的, 所以直接上代碼.(不推薦使用此方式)
public class A { public int Num { get; set; } private static A instance; private A() { Num = -1; } public static A Create() { if (instance == null) { instance = new A(); } return instance; } }
私有化構造函數之後, 外部就不能通過new A()的方式來實例化A類. 那麼此時, 需要提供一個私有化的靜態變數和一個公有化的靜態方法, 來輔助實現單例模式.
測試代碼如下:
static void Main(string[] args) { //A a = new A(); //error A a = A.Create(); a.Num = 0; Console.WriteLine("a.Num = " + a.Num); Console.WriteLine("---------------------");
A b = A.Create(); b.Num = 1; Console.WriteLine("b.Num = " + b.Num); Console.WriteLine("a.Num = " + a.Num); Console.ReadKey(); }
這種方式是最直觀的. 當然, 這裡用的是欄位和函數結合的方式, 使用屬性的方式, 也是可以的, 不在贅述.
下麵介紹另一種方式.
方式二、使用readonly的特性來實現單例模式
public static A Instance { get { return instance; } } private static readonly A instance = new A(); public int Num { get; set; } private A() { Num = -1; }
測試代碼是差不多的, 只不過, 獲取實例的方式變了
A a = A.Instance; a.Num = 0; Console.WriteLine("a.Num = " + a.Num); Console.WriteLine("---------------------"); A b = A.Instance; b.Num = 1; Console.WriteLine("b.Num = " + b.Num); Console.WriteLine("a.Num = " + a.Num); Console.ReadKey();
結果是一樣的, 就不再貼了.
二、多線程單例模式
private static object b = new object(); private static A instance; public static A Instance { get {lock (b) { if (instance == null) { instance = new A(); } } return instance; } }
三、還有一種延遲實例化 - 用內部來來完成初始化工作
public int Num { get; set; } private A() { Num = -1; } public static A Instance { get { return InClass.Instance; } } class InClass { static InClass() { } internal static readonly A Instance = new A(); }
參考資料:
Implementing the Singleton Pattern in C#