單例模式 單例模式(Singleton Pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。 比如,某個伺服器程式的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來讀取配置文 ...
單例模式
單例模式(Singleton Pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。
比如,某個伺服器程式的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來讀取配置文件的信息。如果在程式運行期間,有很多地方都需要使用配置文件的內容,也就是說,很多地方都需要創建 AppConfig 對象的實例,這就導致系統中存在多個 AppConfig 的實例對象,而這樣會嚴重浪費記憶體資源,尤其是在配置文件內容很多的情況下。事實上,類似 AppConfig 這樣的類,我們希望在程式運行期間只存在一個實例對象
python實現單例模式
使用模塊實現
Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成 .pyc
文件,當第二次導入時,就會直接載入 .pyc
文件,而不會再次執行模塊代碼。因此,我們只需把相關的函數和數據定義在一個模塊中,就可以獲得一個單例對象了。
mysingleton.py
class Singleton: def foo(self): print('foo') singleton=Singleton()
其他文件
from mysingleton import singleton singleton.foo()
裝飾器實現
def singleton(cls): _instance = {} def wraper(*args, **kargs): if cls not in _instance: _instance[cls] = cls(*args, **kargs) return _instance[cls] return wraper @singleton class A(object): def __init__(self, x=0): self.x = x a1 = A(2) a2 = A(3)
最終實例化出一個對象並且保存在_instance中,_instance的值也一定是
基於__new__方法實現
當我們實例化一個對象時,是先執行了類的__new__方法(我們沒寫時,預設調用object.__new__),實例化對象;然後再執行類的__init__方法,對這個對象進行初始化,所有我們可以基於這個,實現單例模式
class Singleton(): def __new__(cls, *args, **kwargs): if not hasattr(cls,'_instance'): cls._instance=object.__new__(cls) return cls._instance class A(Singleton): def __init__(self,x): self.x=x a=A('han') b=A('tao') print(a.x) print(b.x)
為了保證線程安全需要在內部加入鎖
import threading class Singleton(): lock=threading.Lock def __new__(cls, *args, **kwargs): if not hasattr(cls,'_instance'): with cls.lock: if not hasattr(cls, '_instance'): cls._instance=object.__new__(cls) return cls._instance class A(Singleton): def __init__(self,x): self.x=x a=A('han') b=A('tao') print(a.x) print(b.x)