設計模式系列
目的:保證一個類別只會產生一個物件,而且要提供存取該物件的統一方法。
生活例子:總統、CEO、部門主管
為什麼要使用單例模式?
平常系統有時候,某些物件我們可能只需要一個,例如;視窗、對話方塊、快取...等
,如果製作多個狀況會有一些問題產生,例如:程式行為異常、資源使用過量、不一致
單例模式,實現有好幾種方式,不考慮執行緒的話
public class Singleton
{
private static Singleton singleton = new Singleton();
private Singleton()
{
}
public static Singleton getInstance() => singleton;
}
第二個狀況是,建立這個物件的時候,運行中不一定需要它。
希望在第一次GetInstance被呼叫的時候花費資源來建立物件,代碼可以調整成如下。
public class Singleton
{
//一開始不先建立物件,很花資源。
private static Singleton instance;
private Singleton()
{
//跑很多Code
//建立物件需要花費很多資源
}
public static Singleton GetSingleton()
{
//第一次呼叫為null,需要物件
if (instance == null)
instance = new Singleton();
return instance; //有這個物件直接回傳
}
}
第三個寫法是,如果遇到多執行緒,同時呼叫GetSingleton的狀況時候,第一個執行緒會跑
到instance = new Singleton(),把時間讓給第二個執行緒也跑了instance = new Singleton()
,造成兩個不同執行緒new出新的物件,這樣沒辦法保證只產生一個物件。
public class Singleton
{
private static Singleton instance;
private Singleton()
{
//跑很多程式...
}
//多執行緒時保證Singleton一定是單一的
public static Singleton GetSingleton()
{
if (instance == null)
{
lock (Singleton.instance)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
元哥的筆記