首頁 > 軟體

python設計模式之單例模式你瞭解多少

2022-03-04 13:01:25

單例模式

概念

單例模式:「保證一個類僅有一個範例,並提供一個存取它的在這裡插入程式碼片全域性存取點。
單例模式會阻止其他物件範例化其自己的單例物件的副本,從而確保所有物件都存取唯一範例。
單例模式應用的場景一般發現在以下條件下:
(1)資源共用的情況下,避免由於資源操作時導致的效能或損耗等。如上述中的紀錄檔檔案,應用設定。
(2)控制資源的情況下,方便資源之間的互相通訊。如執行緒池等。

單例模式使用場景

 - Web應用的設定物件的讀取
 - Windows的Task Manager(工作管理員)
 - 網站的計數器,一般也是採用單例模式實現,否則難以同步
 - 應用程式的紀錄檔應用,一般都何用單例模式實現,這一般是由於共用的紀錄檔檔案一直處於開啟狀態,因為只能有一個範例去操作,否則內容不好追加
 - 資料庫連線池的設計一般也是採用單例模式,因為資料庫連線是一種資料庫資源
 - 多執行緒的執行緒池的設計一般也是採用單例模式,這是由於執行緒池要方便對池中的執行緒進行控制。
 - 

python實現單例模式 

函數裝飾器實現單例

def singleton(class_):
	instances = {)
	def get_instance(*args, **kwargs):
		if class_ not in instances:
			instances[class_] = class_(*argx, **kwargs)
		return instances[class_]
	reyurn get_instance
@singleton
class Cls(object):
    def __init__(self):
        pass
cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2))

輸出結果:

True

instances = {)

使用不可變的類地址作為鍵,其範例作為值,每次創造範例時,首先檢視該類是否存在範例,存在的話直接返回該範例即可,否則新建一個範例並存放在字典中。

使用模組 (常用)實現單例

作為python的模組是天然的單例模式

# mysingleton.py
class My_Singleton(object):
    def foo(self):
        pass
my_singleton = My_Singleton()
# to use
from mysingleton import my_singleton
my_singleton.foo()

基於__new__實現的單例模式(最常用)

類(class)通過方法 new 創造了範例(instance)

class Single(object):
    _instance = None
    def __new__(cls, *args, **kw):
        if cls._instance is None:
            orig = super(Single, cls)
            cls._instance = orig.__new__(cls, *args, **kw)
        return cls._instance
    def __init__(self):
        pass
single1 = Single()
single2 = Single()
print(id(single1) == id(single2))

如果 _instance 為 None,則新建範例,否則直接返回 _instance 存放的範例。

使用 metaclass 實現單例模式

元類(metaclass) 可以通過方法 metaclass 創造了類(class)

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]
class Cls4(metaclass=Singleton):
    pass
cls1 = Cls4()
cls2 = Cls4()
print(id(cls1) == id(cls2))

我們將 metaclass 指向 Singleton 類,讓 Singleton 中的 type 來創造新的 Cls4 範例

web應用組態檔單例實現

def singleton(class_):
    instances = {}
    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]
    return getinstance
@singleton
class Config(dict):
    """
    組態檔類  單例模式
    """
    def __init__(self):
        self.__can_import = True
        self.__init_default()
        dict.__init__(self)
    def __init_default(self):
        self['debug'] = False
        self['autoreload'] = True
    @property
    def can_import(self):
        return self.__can_import
    def import_dict(self, **kwargs):
        if self.__can_import:
            for k, v in kwargs.items():
                self[k] = v
            self.__can_import = False
        else:
            raise Exception('ConfigImportError')
    def clear(self):
        self.__can_import = True
        dict.clear(self)
        self.__init_default()

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!      


IT145.com E-mail:sddin#qq.com