獨體模式 Singleton

獨體模式在設計上是希望確保一個類別在系統運作時只會產生一個instance.

例如: 我們在存取資料庫時,如果每次的存取都會建立一個instacne來並且建立新的連線, 假設同時出現1000個存取需求時,就會建立1000個連線,這樣的設計資料庫一下就爆了.

底下來看一個Python Singleton的範例:

class Singleton:
    instance = None
    @staticmethod
    def get_instance():
        if Singleton.instance is None:
            Singleton.instance = Singleton()
        return Singleton.instance

if __name__ == "__main__":
    instance_1 = Singleton.get_instance()
    instance_2 = Singleton.get_instance()
    print instance_1
    print instance_2

# output:
# <__main__.Singleton instance at 0x7fd5ac518560>
# <__main__.Singleton instance at 0x7fd5ac518560>

這個範例中,把實體化instance的決定權交給class的靜態方法去判斷. class透過宣告一個靜態變數來儲存已實體化的instance避免重複實體化的問題.

這種作法在寫code的時候必須時呼叫特定介面, 如果哪邊忘了呼叫get_instance就會new出一個新的物件.

Python class的特殊方法具有init, new, 我們可以透過new更簡化實體化物件的做法

class Singleton(object):
    instance = None
    def __new__(cls):
        if Singleton.instance is None:
            Singleton.instance = object.__new__(cls)
        return Singleton.instance

if __name__ == "__main__":
    instance_1 = Singleton()
    instance_2 = Singleton()
    print instance_1
    print instance_2

# Output:
# <__main__.Singleton object at 0x7fa1d7c8f410>
# <__main__.Singleton object at 0x7fa1d7c8f410>

Ps.在Java裡面會有雙重鎖的作法,有興趣可以研究一下.