Python设计模式-孤例模式(Singleton)及Borg模式

孤例模式(Singleton)及在python中的进化版Borg模式

目的:传统孤立模式(Singleton) 保障了程序在不同位置都可以且仅可以取到同一个对象实例,即一个类仅最多存在一个实例。Borg模式通过保障同类的所有实例共享所有数据,达到了相同的目的。

传统孤立模式的实现方法很多,如装饰器、metaclass,也可以直接在类的定义中修改。

返回 Python设计模式-outline

示例(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

posted @   坦先生的AI资料室  阅读(305)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示