提到軟體設計模式,不得不提「四人幫」(Gang of Four,GoF)經典著作《設計模式:可複用物件導向軟體的基礎》。這本書被無數資深開發者視為進階的必經之路,甚至有開發者感言:「唯有讀完《設計模式》,我的程式設計造詣才真正實現質的飛躍。」
然而,設計模式並非死記硬背的教條。GoF 總結的 23 種模式只是無數可復用解決方案中的精華。踏入設計模式殿堂的關鍵,在於領會其核心思想,並能靈活融會貫通至實際開發中。今天,我們就從最簡單、卻極具實戰價值的單例模式切入,層層剖析其原理、實作細節與在 .NET 框架中的應用。
顧名思義,單例模式確保一個類在整個應用程式生命週期中只存在唯一實例,並提供一個全域存取點。它屬於創建型模式,解決的是「如何控制類的實例化數量」的問題。
Connection 實例管理連線。乍看之下,單例似乎只是「披著外衣的全域物件」。但兩者有本質區別:
new 建構子建立多個區域實例;單例則透過私有化建構子,從根源上封鎖外部實例化,將「唯一實例」的責任內聚到類別內部。這正是單例模式的核心價值——封裝實例化邏輯,強制單一性。
無論語言如何,實作單例只需掌握兩點:
Instance):public static 保證全域可見與無需實例即可呼叫。private:隱藏建構子,杜絕外部直接 new。using System;
public sealed class Singleton
{
private static Singleton _instance = null;
private static readonly object _lock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
_instance = new Singleton(); // Double-Check Locking
}
}
return _instance;
}
}
}
優點:真正做到「用到才建立」,節省資源。
注意:多執行緒環境下必須加雙重鎖定,否則可能產生多個實例。
public sealed class Singleton
{
private static readonly Singleton _instance = new Singleton();
private Singleton() { }
public static Singleton Instance => _instance;
}
優點:程式碼極簡,CLR 保證執行緒安全與延遲初始化(在第一次存取靜態成員前不建立)。
缺點:若建構子拋出例外,類別將永不可用;且無法處理依賴執行時參數的複雜初始化邏輯。
var s1 = Singleton.Instance;
var s2 = Singleton.Instance;
Console.WriteLine(s1 == s2 ? "see, only one instance!" : "Failed!");
輸出 see, only one instance! 即證明單例生效。
單例思想深深滲透在 .NET 基礎類庫中。最典型的例子是 .NET Remoting 中的伺服器端啟動模式:
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(RemotingSamples.HelloServer),
"SayHello",
WellKnownObjectMode.Singleton);
或在 web.config 設定 <wellknown mode="Singleton" />,修改設定檔即可生效,無需重新編譯,體現了「配置優於程式碼」的彈性。
單例模式以極少的程式碼,優雅地解決了「全域唯一實例」這一普遍需求。它展現了設計模式的核心魅力——將成功的設計經驗封裝為可復用、可維護的結構。掌握單例,不僅是學會一個模式,更是領悟了「封裝變化」的設計哲學。
若渴望系統性掌握更多模式,仍建議研讀 GoF 原著,並在實戰中不斷練習、重構、內化。