設計模式(五)[單件(Singleton)模式]

一、 單件(Singleton)模式

單件模式的特點:

  • 單件類只能有一個實例。
  • 單件類必須自己創建自己的唯一實例。
  • 單件類必須給所有其它對象提供這一實例。

單件模式應用:

  • 每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,避免兩個打印作業同時輸出到打印機。
  • 一個具有自動編號主鍵的表可以有多個用戶同時使用,但數據庫中只能有一個地方分配下一個主鍵編號。否則會出現主鍵重複。
  • 一般系統的數據庫控制類,或數據庫聯接類


二、 Singleton模式的結構:

    Singleton模式包含的角色只有一個,就是Singleton。Singleton擁有一個私有構造函數或保護的構造函數,確保用戶無法通過new直接實例它。除此之外,該模式中包含一個靜態私有成員變量instance與靜態公有方法Instance()。Instance方法負責檢驗並實例化自己,然後存儲在靜態成員變量中,以確保只有一個實例被創建。(關於線程問題以及C#所特有的Singleton將在後面詳細論述)。


三、 程序舉例:

該程序演示了Singleton的結構,本身不具有任何實際價值。 

// Singleton pattern -- Structural example  
using System;

// "Singleton"
class Singleton
{
  
// Fields
  private static Singleton instance;

  
// Constructor
  protected Singleton() {}

  
// Methods
  public static Singleton Instance()
  
{
    
// Uses "Lazy initialization"
    if( instance == null )
      instance 
= new Singleton();

    
return instance;
  }

}


/// <summary>
/// Client test
/// </summary>

public class Client
{
  
public static void Main()
  
{
    
// Constructor is protected -- cannot use new
    Singleton s1 = Singleton.Instance();
    Singleton s2 
= Singleton.Instance();

    
if( s1 == s2 )
      Console.WriteLine( 
"The same instance" );
  }

}



四、 在什麼情形下使用單例模式:

    使用Singleton模式有一個必要條件:在一個系統要求一個類只有一個實例時才應當使用單例模式。反過來,如果一個類可以有幾個實例共存,就不要使用單例模式。

注意:

不要使用單件模式存取全局變量。這違背了單例模式的用意,最好放到對應類的靜態成員中。

不要將數據庫連接做成單例,因爲一個系統可能會與數據庫有多個連接,並且在有連接池的情況下,應當儘可能及時釋放連接。Singleton模式由於使用靜態成員存儲類實例,所以可能會造成資源無法及時釋放,帶來問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章