Python设计模式-孤例模式(Singleton)及Borg模式
孤例模式(Singleton)及在python中的进化版Borg模式
目的:传统孤立模式(Singleton) 保障了程序在不同位置都可以且仅可以取到同一个对象实例,即一个类仅最多存在一个实例。Borg模式通过保障同类的所有实例共享所有数据,达到了相同的目的。
传统孤立模式的实现方法很多,如装饰器、metaclass,也可以直接在类的定义中修改。
示例(Singleton)
# 装饰器版本
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class MySingleton1(object):
def __init__(self):
pass
# 直接在类定义中修改
class MySingleton2:
_INSTANCE = None
def __new__(cls, *args, **kwargs):
'''通过重定义__new__,实现创建时对是否已存在实例进行判别。'''
if not cls._INSTANCE:
cls._INSTANCE = super(MySingleton, cls).__new__(cls, *args, **kwargs)
return cls._INSTANCE
def __init__(self, *args, **kwargs):
pass
Borg模式将全部实例,与子类的全部实例。共用同一个__dict__。这样保证了所有实例状态的一致性。这同样属于单例模式的理念。在python中,建议使用Borg模式来达到Singleton的目的。
示例(Borg)
class Borg(object):
__shared_state = {}
def __new__(cls, *args, **kwargs):
self = object.__new__(cls, *args, **kwargs)
# 通过这种方式, 所有Borg的子类,都共享了__shared_state
self.__dict__ = cls.__shared_state
class YourBorg(Borg):
def __init__(self, state=None):
pass
# 装饰器版本
def borg(cls):
cls._state = {}
orig_init = cls.__init__
def new_init(self, *args, **kwargs):
self.__dict__ = cls._state
orig_init(self, *args, **kwargs)
cls.__init__ = new_init
return cls
@borg
class YourBorg:
pass
ref
https://www.jb51.net/article/167223.htm
https://blog.csdn.net/leongongye/article/details/47132057
本文来自博客园,作者:坦先生的AI资料室,转载请注明原文链接:https://www.cnblogs.com/yushengchn/p/16478427.html
分类:
python设计模式系列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现