單例模式
Singleton 模式旨在將類的建立限制為一個例項。
這種模式用於只有一個東西才有意義的場景,例如:
- 一個編排其他物件互動的單一類,例如。經理類
- 或者一個代表唯一的單一資源的類,例如記錄元件
實現 Singleton 模式的最常見方法之一是通過靜態**工廠方法,**例如 CreateInstance()
或 GetInstance()
(或 C#中的靜態屬性,Instance
),然後將其設計為始終返回相同的例項。
對方法或屬性的第一次呼叫建立並返回 Singleton 例項。此後,該方法始終返回相同的例項。這樣,只有一個單例物件的例項。
防止通過 new
建立例項可以通過使類建構函式 private.
來實現
以下是在 C#中實現 Singleton 模式的典型程式碼示例:
class Singleton
{
// Because the _instance member is made private, the only way to get the single
// instance is via the static Instance property below. This can also be similarly
// achieved with a GetInstance() method instead of the property.
private static Singleton _instance = null;
// Making the constructor private prevents other instances from being
// created via something like Singleton s = new Singleton(), protecting
// against unintentional misuse.
private Singleton()
{
}
public static Singleton Instance
{
get
{
// The first call will create the one and only instance.
if (_instance == null)
{
_instance = new Singleton();
}
// Every call afterwards will return the single instance created above.
return _instance;
}
}
}
為了進一步說明這種模式,下面的程式碼檢查在多次呼叫 Instance 屬性時是否返回相同的 Singleton 例項。
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.Instance;
Singleton s2 = Singleton.Instance;
// Both Singleton objects above should now reference the same Singleton instance.
if (Object.ReferenceEquals(s1, s2))
{
Console.WriteLine("Singleton is working");
}
else
{
// Otherwise, the Singleton Instance property is returning something
// other than the unique, single instance when called.
Console.WriteLine("Singleton is broken");
}
}
}
注意:此實現不是執行緒安全的。
要檢視更多示例,包括如何使此執行緒安全,請訪問: Singleton Implementation
單例在概念上類似於全域性價值,並導致類似的設計缺陷和擔憂。因此,Singleton 模式被廣泛認為是反模式。
訪問 “單例有什麼壞處?” 有關使用它們時出現的問題的更多資訊。
在 C#中,你可以建立一個類 static
,它使所有成員都是靜態的,並且無法例項化該類。鑑於此,通常會看到使用靜態類代替 Singleton 模式。
有關兩者之間的主要區別,請訪問 C#Singleton Pattern 與 Static Class 。