一、概述
在軟件開發過程中,我們有時候需要保證一個類僅有一個實例,比如在一個電腦用戶下只能運行一個outlook實例。這時就需要用到單件模式。
二、單件模式
單件模式保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。。
單件模式的結構圖如下:

Singleton負責創建自己的唯一實例,並定義一個Instance方法允許客戶訪問該實例。
三、示例
先來看看最簡單的單件模式實現例子。
1 class SimpleSingleton
2 {
3 private static SimpleSingleton _instance;
4
5 private SimpleSingleton()
6 {
7 }
8
9 public static SimpleSingleton Instance()
10 {
11 if (_instance == null)
12 {
13 _instance = new SimpleSingleton();
14 }
15 return _instance;
16 }
17 }
顯然,這種實現方式並不是線程安全的,在多線程環境中可能會得到多個SimpleSingleton實例。要解決這一問題,可以使用雙重否定的方式。首先創建一個Singleton類的私有靜態變量 padlock。
private static readonly object _padlock = new object();
然后修改Instance方法。
1 if (instance==null)
2 {
3 lock (_padlock)
4 {
5 if (instance==null)
6 {
7 instance = new Singleton();
8 }
9 }
10 }
11 return instance;
在實際應用中,一般可以利用C#靜態初始化的特性來實現線程安全的Singleton。
1 class ThreadSafeSingleton
2 {
3 private static ThreadSafeSingleton _instance = new ThreadSafeSingleton();
4
5 private ThreadSafeSingleton()
6 {
7 }
8
9 public static ThreadSafeSingleton Instance()
10 {
11 return _instance;
12 }
13 }
這種方法比較簡單,但也有一個缺點,即無法實現延遲初始化。對此可以在Singleton類中創建一個嵌套類,利用嵌套類來實現延遲初始化,這里就不再贅述。

