熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

從C#的Singleton設計模式實現看.NETFramework特性對開發者的重要性

2013-11-13 10:01:46  來源: .NET編程 

  近來我在學習如何在C#語言中使用設計模式中讀到一些資料其中有關Singleton設計模式引起了我的注意

   

  學過設計模式的開發者都知道Singleton模式我想簡要地解釋一下這個設計模式是為那些尚未學習過設計模式的朋友Singleton設計模式是告訴您如何在你的應用程序創建一個唯一類示例的全局對象也就是說這個對象只能被實例化一次這個對象同時提供一個訪問它的一個全局的訪問點這種對象如應用程序中的窗口管理器或者是打印假脫機數據庫連接池等

   

  現在讓我們先看一下設計模式一書中對Singleton模式的C++實現(為了方便比較我把實現的代碼寫成內聯的方式)

   

  class Singleton

   

  {

   

  public:

   

  static Singleton* Instance()

   

  {

   

  if(_instance==)

   

  {

   

  _instance=new Singleton;

   

  }

   

  return _instance;

   

  }

   

  protected:

   

  Singleton();

   

  Private:

   

  Static Singleton* _instance;

   

  };

   

  Stington* Singleton::_instance=;

   

  這裡我不想對上述的代碼作解釋大家可以參閱本文後面提供的參考文獻

   

  為了更好的理解C#我這裡也出示一下Java中的Singleton模式實現代碼(不是有人認為C#是對Java的剽竊嗎J)

   

  class Singleton

   

  {

   

  public Singleton Instance()

   

  {

   

  if(_instace==null)

   

  {

   

  synchronized (ClassforName(Singleton))

   

  {

   

  if (_instance == null)

   

  {

   

  _instance = new Singleton();

   

  }

   

  }

   

  }

   

  return _instance;

   

  }

   

  protected Singleton() {}

   

  private static Singleton _instance = null;

   

  }

   

  在上述的Java代碼中使用了雙重檢測機制來避免多個線程的Singleton實例化問題同樣我也不想對上述的代碼做任何解釋

   

  首先讓我們看一下C#中類似Java的實現

   

  class Singleton

   

  {

   

  public static Singleton Instance()

   

  {

   

  if(_instance==null)

   

  {

   

  lock (typeof(Singleton))

   

  {

   

  if(_instace==null)

   

  {

   

  _instance=new Singleton();

   

  }

   

  }

   

  }

   

  return _instance;

   

  }

   

  protected Singleton(){}

   

  private static volatile Singleton _instance=null;

   

  }

   

  現在是我們睜大眼睛的時候了下面是利用NET Framework平台優勢實現Singleton模式的代碼

   

  sealed class Singleton

   

  {

   

  private Singleton();

   

  public static readonly Singleton Instance=new Singleton();

   

  }

   

  非常吃驚是不是不僅代碼減少了許多同時也解決了線程問題帶來的性能上損失有避免了編譯器優化的問題上述的代碼真的能正常工作嗎?如果能那麼它又是怎樣工作的呢?

   

  注意到Singleton類被聲明為sealed以此保證它自己不會被繼承其次沒有了Instance的方法將原來_instance成員變量變成public readonly並在聲明時被初始化通過這些改變我們確實得到了Singleton的模式原因是在JIT的處理過程中如果類中的static屬性被任何方法使用時NET Framework將對這個屬性進行初始化於是在初始化Instance屬性的同時Singleton類實例得以創建和裝載而私有的構造函數和readonly(只讀)保證了Singleton不會被再次實例化這正是Singleton設計模式的意圖

   

  本文不是要討論設計模式而只是想通過這個例子來說明一件事那就是精通NET Framework並將它靈活運用對實際應用開發的重要性


From:http://tw.wingwit.com/Article/program/net/201311/12319.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.