網站首頁 編程語言 正文
單例模式
概念
單例模式:“保證一個類僅有一個實例,并提供一個訪問它的在這里插入代碼片全局訪問點。 單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。 單例模式應用的場景一般發現在以下條件下: (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()
總結
原文鏈接:https://blog.csdn.net/qq_40861391/article/details/123241435
相關推薦
- 2022-12-05 python中的單下劃線與雙下劃線以及絕對導入與相對導入_python
- 2022-11-03 python中for循環的多種使用實例_python
- 2022-07-12 合理使用gateWay過濾器,實現Concroller自動注入用戶信息
- 2022-09-03 Python?pandas?DataFrame基礎運算及空值填充詳解_python
- 2022-06-11 FreeRTOS進階之調度器啟動過程分析_操作系統
- 2022-11-14 UNIX環境高級編程筆記
- 2022-09-25 ORACLE數據庫數據泵的導入導出
- 2023-07-08 前端加載報錯Cannot assign to read only property ‘exports
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支