Singleton設計模式可以在應用程序創建一個唯一的全局對象,也就是說,這個對象只能被實例化一次。 應用程序中的窗口管理器或者是數據庫連接池等,都是Singleton模式的典型應用。
運用C#語言可以很方便地實現Singleton模式,然而同樣是實現Singleton模式,由於實現方式的不同,運行效果也會有所不同。下面分別說明並比較C#實現Singleton模式的兩種方法:
C#特有的方式實現Singleton(方式1)
/**//// <summary>
/// 單鍵模式的簡單實現方式
/// </summary>
public sealed class SampleSingleton1
{
private int m_Counter = 0;
private SampleSingleton1()
{
Console.WriteLine("初始化SampleSingleton1。");
}
public static readonly SampleSingleton1 Singleton = new SampleSingleton1();
/**//// <summary>
/// 調用次數計數器
/// </summary>
public void Counter()
{
m_Counter ++;
}
}
說明一下,sealed關鍵字保證了該單鍵類不會被繼承,readonly關鍵字保證了Singleton實例入口為只讀。
傳統方式實現Singleton(方式2)
之所以稱為傳統方式,是因為C++和Java都是采用的這種方式,代碼如下:
/**//// <summary>
/// 單鍵模式的傳統實現方式
/// </summary>
public class SampleSingleton2
{
// 注意:公用變量最好使用volatile關鍵字,原因參看MSDN
private static volatile SampleSingleton2 m_Instance = null;
private int m_Counter = 0;
private SampleSingleton2()
{
Console.WriteLine("初始化SampleSingleton2。");
}
/**//// <summary>
/// 獲取單鍵實例
/// </summary>
public static SampleSingleton2 Singleton
{
get
{
if (m_Instance == null)
{
lock (typeof(SampleSingleton2))
{
if (m_Instance == null)
{
m_Instance = new SampleSingleton2();
}
}
}
return m_Instance;
}
}
/**//// <summary>
/// 調用次數計數器
/// </summary>
public void Counter()
{
m_Counter ++;
}
}
上面的代碼使用了volatile關鍵字和lock關鍵字來保證正確創建(即只創建一次)以及正確獲取實例。