2019年3月8日 星期五

設計模式(5) 單例模式 (Singleton Pattern)

此篇介紹GoF設計模式(Design Pattern)的其中一種—單例模式 (Singleton Pattern)。


適用問題:

  有時我們希望物件只存在唯一一個,例如:thread pool、caches、dialog box...,而單例模式能滿足我們這個需求。




單例模式定義:
  "The Singleton Pattern ensures a class has only one instance, and provides a global point of access to it." (單例模式保證一個類別僅有一個實例,並提供一個存取他的全域存取點)



單例模式code (C++):
  單例模式的實作重點是把 constructor() 放在private區裡,private區裡的東西要透過物件存取,但要生成物件就必須執行constructor(),所以將constructor()放在private裡我們將無法生成物件,因此我們加入另一個 static Singleton *getInstance() 來幫我們生成第一個物件,若第一個物件已被生成過則回傳那第一個物件。

class Singleton{
    private:
        static Singleton *uniqueInstance;
        Singleton(){}

    public:
        static Singleton *getInstance(){
            if(uniqueInstance == null){
                uniqueInstance = new Singleton();
            }
            return uniqueInstance;
        }
        // other useful methods here
}

(但要注意上面的code並非thread-safe,在多thread下可能會出問題,應該要在if(uniqueInstance == null)前加入mutex之類的鎖,避免生成多個物件)




  參考資料:
    1. Head First Design Patterns
    2. JavaScript設計模式與開發實踐 (博碩出版)


沒有留言:

張貼留言