使用C#2.0泛型實現單例模式重用

字號:

介紹
    很多有著不同開發(fā)背景得人都會比較熟悉單例模式。他們會發(fā)現每次他們要創(chuàng)建一個不同的單例類的時候,都不得不寫同樣得代碼。使用新的C# 2.0的泛型,可以實現只寫一次同樣得代碼。
    使用 C# 2.0 泛型來完成單例模式的重用
    使用 C# 2.0 的泛型,使得實現我所說的"單例提供者"成為可能。這是一個可用來創(chuàng)建單例類實例確不需要為每個特定的類重寫單例模式代碼的可重用的類。這樣分離出單例結構的代碼,將有利于保持按單例模式使用類或不按單例模式使用類的靈活性。
    public sealed class Singleton
    {
    Singleton()
    {}
    public static Singleton Instance
    {
    get
    {
    return SingletonCreator.instance;
    }
    }
    class SingletonCreator
    {
    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Nested()
    {}
    internal static readonly Singleton instance = new Singleton();
    }
    }
    基于對泛型的了解,你可以發(fā)現沒有理由不在這段代碼里替換類型參數為泛型里典型的'T'。如果這樣做,這段代碼就變成下面這樣。
    public class SingletonProvider where T : new()
    {
    SingletonProvider() { }
    public static T Instance
    {
    get { return SingletonCreator.instance; }
    }
    class SingletonCreator
    {
    static SingletonCreator() { }
    internal static readonly T instance = new T();
    }
    }
    注意在這里使用了泛型的約束。這個約束強制任何類型'T'都必須具有無參數的公共構造函數。這里允許singletonCreator類來實例化類型'T'。
    那么,要怎么樣來使用單例提供者呢?為了弄清除如何使用它,我們需要寫一個測試類。這個測試類有兩個部分。第一部分是一個默認的構造函數,用來設置timestamp變量的值。第二部分是一個公共函數,用來實現用"Debug.WriteLine"來輸出timestamp的值。這個測試類的意思就是不論那個線程在任何時候,在單例下調用這個類公共方法,都將返回相同的值。
    public class TestClass
    {
    private string _createdTimestamp;
    public TestClass ()
    {
    _createdTimestamp = DateTime.Now.ToString();
    }
    public void Write()
    {
    Debug.WriteLine(_createdTimestamp);
    }
    }
    這個類就像下面這樣使用單例提供者:
    SingletonProvider.Instance.Write();
    關注點
    我已經在一個超線程的雙處理器上使用100個線程在單態(tài)模式下進行了測試。所有線程都返回相同的值,這說明這是一個線程安全的使用泛型來實現的單態(tài)模式。 我相信這已經充分說明了泛型怎么幫助你簡化代碼。