獨體模式 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裡面會有雙重鎖的作法,有興趣可以研究一下.