Singleton 設計模式的下列實現采用了 Design Patterns: Elements of Reusable Object-OrIEnted Software[Gamma95] 中所描述的解決方案,但對它進 行了修改,以便利用 C# 中可用的語言功能,如屬性:
using System;
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
該實現主要有兩個優點:
• 由於實 例是在 Instance 屬性方法內部創建的,因此類可以使用附加功能(例如,對子 類進行實例化),即使它可能引入不想要的依賴性。
• 直到對象要 求產生一個實例才執行實例化;這種方法稱為"懶實例化"。懶實例化 避免了在應用程序啟動時實例化不必要的 singleton。
但是,這種實現的 主要缺點是在多線程環境下它是不安全的。如果執行過程的不同線程同時進入 Instance 屬性方法,那麼可能會創建多個 Singleton 對象實例。每個線程都會 執行下列語句,並決定必須創建新的實例:
if (instance == null)
解決此問題的方法有很多。一種方法是使用被稱為 Double-Check Locking[Lea99] 的技術。而 C# 與公共語言運行庫也提供了一種"靜態初始 化"方法,這種方法不需要開發人員顯式地編寫線程安全代碼,即可解決這 些問題。