為什麼需要單例模式:
首先來明確一個問題,那就是在某些情況下,有些對象,我們只需要一個就可以了,
比如,一台電腦上可以連好幾個印表機,但是這個電腦上的列印程式只能有一個,
這裡就可以通過單例模式來避免兩個列印工作同時輸出到印表機中,
即在整個的列印過程中我只有一個列印程式的執行個體。
簡單說來,單例模式(也叫單件模式)的作用就是保證在整個應用程式的生命週期中,
任何一個時刻,單例類的執行個體都只存在一個(當然也可以不存在)。
Singleton 類(懶漢式)
namespace Singleton
{
public class Singleton
{
//定義一個私人的靜態全域變數來儲存該類的唯一執行個體
private static Singleton singleton;
/// <summary>
/// 建構函式必須是私人的
/// 這樣在外部便無法使用 new 來建立該類的執行個體
/// </summary>
private Singleton()
{
}
/// <summary>
/// 定義一個全域訪問點
/// 設定為靜態方法
/// 則在類的外部便無需執行個體化就可以調用該方法
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
//這裡可以保證只執行個體化一次
//即在第一次調用時執行個體化
//以後調用便不會再執行個體化
if (singleton == null)
{
singleton = new Singleton();
}
return singleton;
}
}
}
測試類別代碼:
class SingletonTest
{
public static void Main(string[] args)
{
Singleton.Singleton singletonOne = Singleton.Singleton.GetInstance();
Singleton.Singleton singletonTwo = Singleton.Singleton.GetInstance();
if (singletonOne.Equals(singletonTwo))
{
Console.WriteLine("singletonOne 和 singletonTwo 代表的是同一個執行個體");
}
else
{
Console.WriteLine("singletonOne 和 singletonTwo 代表的是不同一個執行個體");
}
Console.ReadKey();
}
}
從上面的結果可以看出來,儘管我兩次訪問了 GetInstance(),但是我訪問的只是同一個執行個體,
換句話來說,上面的代碼中,由於建構函式被設定為 private 了,
所以您無法再在 Singleton 類的外部使用 new 來執行個體化一個執行個體,您只能通過訪問 GetInstance()來訪問 Singleton 類,
GetInstance()通過如下方式保證該 Singleton 只存在一個執行個體:
首先這個 Singleton 類會在在第一次調用 GetInstance()時建立一個執行個體,並將這個執行個體的引用封裝在自身類中,
然後以後調用 GetInstance()時就會判斷這個 Singleton 是否存在一個執行個體了,如果存在,則不會再建立執行個體。
而是調用以前產生的類的執行個體,這樣下來,整個應用程式中便就只存在一個執行個體了。
從這裡再來總結單例模式的特點:
首先,單例模式使類在程式生命週期的任何時刻都只有一個執行個體,
然後,單例的建構函式是私人的,外部程式如果想要訪問這個單例類的話,
必須通過 GetInstance()來請求(注意是請求)得到這個單例類的執行個體。