什麼是靜態單例模式?
靜態單例模式(Static Singleton Pattern)是我在實踐中總結的模式,主要解決的問題是在預Crowdsourced Security Testing道某依賴項為單例應用時,通過靜態緩衝該依賴項來提供訪問。當然,解決該問題的辦法有很多,這隻是其中一個。
實現細節
/// <summary> /// 靜態單例 /// </summary> /// <typeparam name="TClass">單例類型</typeparam> public static class Singleton<TClass> where TClass : class, new() { private static readonly object _lock = new object(); private static TClass _instance = default(TClass); /// <summary> /// 擷取單例執行個體 /// </summary> public static TClass GetInstance() { return Instance; } /// <summary> /// 單例執行個體 /// </summary> public static TClass Instance { get { if (_instance == null) { lock (_lock) { if (_instance == null) { _instance = new TClass(); // must be public constructor } } } return _instance; } } /// <summary> /// 設定單例執行個體 /// </summary> /// <param name="instance">單例執行個體</param> public static void Set(TClass instance) { lock (_lock) { _instance = instance; } } /// <summary> /// 重設單例執行個體 /// </summary> public static void Reset() { lock (_lock) { _instance = default(TClass); } } }
應用測試
class Program { interface IInterfaceA { string GetData(); } class ClassA : IInterfaceA { public string GetData() { return string.Format("This is from ClassA with hash [{0}].", this.GetHashCode()); } } static void Main(string[] args) { string data1 = Singleton<ClassA>.GetInstance().GetData(); Console.WriteLine(data1); string data2 = Singleton<ClassA>.GetInstance().GetData(); Console.WriteLine(data2); Console.ReadKey(); } }
測試結果