使用 C# 2.0 泛型來完成單例模式的重用

來源:互聯網
上載者:User

  使用 C# 2.0 的泛型,使得實現我所說的"單例提供者"成為可能。這是一個可用來建立單例類執行個體確不需要為每個特定的類重寫單例模式代碼的可重用的類。這樣分離出單例結構的代碼,將有利於保持按單例模式使用類或不按單例模式使用類的靈活性。

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(); }}

  基於對泛型的瞭解,你可以發現沒有理由不在這段代碼裡替換型別參數為泛型裡典型的'T'。如果這樣做,這段代碼就變成下面這樣。

public class SingletonProvider<T> 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<TestClass>.Instance.Write();

  關注點

  我已經在一個超執行緒的雙處理器上使用100個線程在單態模式下進行了測試。所有線程都返回相同的值,這說明這是一個安全執行緒的使用泛型來實現的單態模式。 我相信這已經充分說明了泛型怎麼協助你簡化代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.