單例模式-Singleton Pattern

設計模式系列

目的:保證一個類別只會產生一個物件,而且要提供存取該物件的統一方法。

生活例子:總統、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;
        }
    }

 

元哥的筆記