天天看點

分分鐘帶你了解單例

單例模式的講解以及用處

什麼是單例模式用處何在?

答:單例模式(Singleton Pattern)是一種常用的軟體設計模式,該模式的主要目的是確定某一個類隻有一個實列存在,當你希望整個系統中隻能出現一個實列時,這個時候單例對象就可以派上用場了。

舉個列子!!

比如、某個伺服器程式的配置資訊存放在一個檔案中,用戶端通過一個AppConfig的類來讀取配置檔案的資訊。如果在程式運作期間,有很多地方都需要使用配置檔案的内容,也就是說,很多地方都需要建立AppConfig對象實列,這就導緻系統中存在多個AppConfig的實列對象,而這樣會嚴重浪費記憶體資源,尤其是在配置檔案内容很多的情況下,事實上類似AppConfig這樣的類,我們希望在程式運作期間隻存在一個執行個體對象。

用 __new__來建立單例

如果想使得某個類從始至終最多隻有一個執行個體,使用__new__方法會很簡單,Python中類是通過__new__來建立執行個體的。

1 class A(object):
 2     def __new__(cls, *args, **kwargs):
 3         if not hasattr(cls,'_inst'):
 4             cls._inst = super(A, cls).__new__(cls, *args, **kwargs)
 5         return cls._inst
 6 if __name__ == '__main__':
 7     class B(A):
 8         def __init__(self,s):
 9             self.s = s
10     ret = A()
11     ret1 = B('two')
12     print id(ret),ret
13     print id(ret1),ret1.s
14 
15 #結果
16 53445264 <__main__.A object at 0x032F8290>
17 53445392 two      

通過__new__方法,将類的執行個體在建立的時候綁定到類屬性_inst,如果cls._inst為None,說明類還沒執行個體化,實列化并将執行個體綁定到cls._inst,以後每次執行個體化的時候都傳回第一次實列化建立的執行個體,注意從A派生子類的時候,不要重載__new__。