一、 單件(Singleton)模式
單件模式的特點:
- 單件類只能有一個實例。
- 單件類必須自己創建自己的唯一實例。
- 單件類必須給所有其它對象提供這一實例。
單件模式應用:
- 每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,避免兩個打印作業同時輸出到打印機。
- 一個具有自動編號主鍵的表可以有多個用戶同時使用,但數據庫中只能有一個地方分配下一個主鍵編號。否則會出現主鍵重複。
- 一般系統的數據庫控制類,或數據庫聯接類
二、 Singleton模式的結構:
Singleton模式包含的角色只有一個,就是Singleton。Singleton擁有一個私有構造函數或保護的構造函數,確保用戶無法通過new直接實例它。除此之外,該模式中包含一個靜態私有成員變量instance與靜態公有方法Instance()。Instance方法負責檢驗並實例化自己,然後存儲在靜態成員變量中,以確保只有一個實例被創建。(關於線程問題以及C#所特有的Singleton將在後面詳細論述)。
三、 程序舉例:
該程序演示了Singleton的結構,本身不具有任何實際價值。
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模式由於使用靜態成員存儲類實例,所以可能會造成資源無法及時釋放,帶來問題。