建立型模式:Singleton單件

                                                                     建立型模式:Singleton單件
1、模式分類
  1)從目的來看:
    A:建立型(Creational)模式:負責對象建立。
    B:結構型(Structural)模式:處理類與對象間的組合。
    C:行爲型(Behavioral)模式:類與對象交互中的職責分配。
  2)從範圍來看:
    A:類模式處理類與子類的靜態關係。
    B:對象模式處理對象間的動態關係。
   
2、動機(Motivation)
  1)在軟件系統中,常常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。
  2)如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例?
  3)這應該是類設計者的責任,而不是使用者的責任。


3、意圖(Intent)
  保證一個類僅有一個實例,並提供一個該實例的全局訪問點。
                                              ——《設計模式》GoF設計模式


4、單線程Singleton模式實現
public class Singleton
{
  private static Singleton _instance;
  //重點在這,私有構造,不讓外部new
  private Singleton()
  {
  }
  public static Singletoon Instance
  {
    get
    {
      if (_instance == null)
      {
        _instance = new Singleton();
      }
      return _instance;
    }
  }
}多線程

class Test
{
  public static void Main()
  {
    Singleton t1 = Singleton.Instance;
    Singleton t2 = Singleton.Instance;
    //查看t1, t2的引用是否相等
    Console.WriteLine(Object.ReferenceEquals(t1, t2) == true);
  }
}編輯器

5、單線程Singleton模式的幾個要點
  1)Singleton模式中的實例構造器能夠設置爲protected以容許子類派生。
  2)Singleton模式通常不要支持ICloneable接口,由於這能夠會致使多個對象實例,與Singleton模式的初衷違背。由於IClonealbe是克隆淺拷鋇。
  3)Singleton模式通常不要支持序列化,由於這也有可能致使多個對象實例,一樣與Singleton模式初衷違背。序列化能實現克隆的深拷鋇。
  4)Singleton模式只考慮到了對象建立的管理,沒有考慮對象銷燬的管理。就支持垃圾回收的平臺和對象的開銷來說,咱們通常沒有必要 對其銷燬進行特殊的管理。
  5)不能應對多線程環境:在多線程環境下,使用Singleton模式仍然有可能獲得Singleton類的多個實例對象。
 
6、多線程單件
  1)第一實現方法
public class Singleton
{
  /* 關鍵字volatile保證嚴格意義的多線程不會出現微調,嚴格按順序執行,
  若是刪除關鍵字volatile,編輯器有可能對代碼進行微調,仍是有可能出現new屢次的狀況*/
  private static volatile Singleton _instance = null;
  // 輔助器,本向不參與真正意義的構建
  private static object _lockHelper = new Object();
 
  private Singleton()
  {
  }
 
  // 沒有參數時使用靜態屬性,有參數時應使用方法GetInstance
  public static Singleton Instance
  {
    get
    {
      if (_instance == null)
      {
        lock (_lockHelper) // 鎖住_lockHelper,避免多線程的訪問
        {
          if (instance == null)//雙檢查
          {
            _instance = new Singleton();
          }
        }
      }
      return _instance;
    }
  }
 
  // 帶參數的實現以下
  private int x;
  private int y;
 
  private Singleton(int x, int y)
  {
    this.x = x;
    this.y = y;
  }
 
  public Singleton GetInstance(int x, int  y)
  {
    if (_instance == null)
    {
      _instance = new Singleton(x, y);
    }
    else
    {
      _instance.x = x;
      _instance.y = y;
    }
    return _instance;
  }
}
  2)第二種實現方法:不支持參數化的構造
  //sealed須要不須要看實際狀況
sealed class Singleton
{
  //類連初始化,實際上會在靜態構造器裏面初始化
  public static readonly Singleton Instance = new Singleton();
  private int _X;
  private int _Y;
  private Singleton()
  {
  }
  public void Init(FileStream fs)
  {
  }
  public int X
  {
    get
    {
      return _X;
    }
    set
    {
      this._X = value;
    }
  }
  public int Y
  {
    get
    {
      return _Y;
    }
    set
    {
      this._Y = value;
    }
  }
}this

  上面的方法等同於下面的方法
 
sealed class Singleton
{
  public static readonly Singleton Instance;
  //靜態構造器,只在靜態字段初始化前初始化
  static Singleton()
  {
    Instance = new Singleton();
  }
  private Singleton()
  {
  }
}線程

class Test
{
  public static void Main()
  {
    singleton instance = Singleton.Instance;
    instance.Init(new FileStream("..."));
    instance.X = 100;
    instance.Y = 200;
    Console.WriteLine(instance);
  }
}設計

7、Singleton模式擴展
  1)Singleton模式是對建立對象個數的控制。將一個實例擴展到n個實例,例如對象池的實現。建立n個實例放入到集合對象中,供用戶使用,達到資源的有效管理。
  2)將new構造的調用轉移到其餘類中,例如多個類協同工做環境中,某個局部環境只須要擁有某個類的一個實例。
  3)理解和擴展Singleton模式的核心是「如何控制用戶使用new對一個類的實例構造器的任意調用」。
對象

相關文章
相關標籤/搜索