創建型模式之單例模式
單例模式
保證一個類僅有一個實例,并且提供一個訪問他的全局訪問點。
意圖
確保類有且只有一個對象被創建
為對象提供一個訪問點,以使程序可以全局訪問對象
控制共享資源的并行訪問
優點
1、由于單例模式要求在全局內只有一個實例,因而可以節省比較多的內存空間; 2、全局只有一個接入點,可以更好地進行數據同步控制,避免多重占用; 3、單例可長駐內存,減少系統開銷。
實現
1.模塊級別的單例模式
其實,Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。因此,我們只需把相關的函數和數據定義在一個模塊中,就可以獲得一個單例對象了。
class Singleton(object): def foo(self): pass singleton = Singleton()
這樣我們一旦調用到上面第py文件就會產生一個singleton_by_module.pyc,以后我們每次調用都會直接引用這里面的代碼。
2.函數級別的單例模式
裝飾器里面的外層變量定義一個字典,里面存放這個類的實例.
def singleton(cls): # 單下劃線的作用是這個變量只能在當前模塊里訪問,僅僅是一種提示作用 # 創建一個字典用來保存類的實例對象 _instance = {} def _singleton(*args, **kwargs): # 先判斷這個類有沒有對象 if cls not in _instance: _instance[cls] = cls(*args, **kwargs) # 創建一個對象,并保存到字典當中 # 將實例對象返回 return _instance[cls] return _singleton @singleton class A(object): a = 1 def __init__(self, x=0): self.x = x
3.類級別的單例模式
餓漢式:
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(Singleton, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance
懶漢式:
class Singleton(object): """ # 懶漢模式: 只有在使用時才創建單例對象,實例化時不創建 """ _instance = None def __init__(self): if not hasattr(Singleton, '_instance'): print("__init__ method called, but no instance created") else: print("instance already created:", self._instance) @classmethod def get_instance(cls): if not cls._instance: cls._instance = Singleton() return cls._instance
4.Monostate單例模式
所有實例共享相同的狀態
class Borg(object): _shared_state = {} def __new__(cls, *args, **kwargs): obj = super(Borg, cls).__new__(cls, *args, **kwargs) obj.__dict__ = cls._shared_state return obj
5.單例和元類
class MetaSingleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(MetaSingleton, cls).__call__(cls, *args, **kwargs) return cls._instances[cls] class Logger(metaclass=MetaSingleton): pass
缺點
單例模式的缺點 1、單例模式的擴展是比較困難的; 2、賦于了單例以太多的職責,某種程度上違反單一職責原則(六大原則后面會講到); 3、單例模式是并發協作軟件模塊中需要最先完成的,因而其不利于測試; 4、單例模式在某種情況下會導致“資源瓶頸”。
應用
單例模式的應用舉例: 1、生成全局惟一的序列號; 2、訪問全局復用的惟一資源,如磁盤、總線等; 3、單個對象占用的資源過多,如數據庫等; 4、系統全局統一管理,如Windows下的Task Manager; 5、網站計數器。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。