单例模式 python实现
一、代码核心模式:单例模式(Singleton Pattern)
这段代码实现的是单例模式(更具体地说,是「懒汉式单例模式」),这是设计模式中最常用的创建型模式之一。
1. 单例模式的核心定义
单例模式的核心目标是保证一个类在整个程序生命周期中只有一个实例对象,并提供一个全局唯一的访问入口。简单来说,无论调用多少次创建方法,都只会生成同一个对象,避免重复实例化造成的资源浪费。
2. 代码逐行解析(为什么是单例模式)
from pydantic import PrivateAttr # 补充代码依赖,方便理解
class EventBus(Plugin):
# 1. 私有类属性:存储唯一实例,PrivateAttr确保该属性仅内部访问
_instance: 'EventBus' = PrivateAttr(None)
@classmethod
def get_instance(cls) -> 'EventBus':
# 2. 懒加载判断:只有当实例为None时,才创建新实例
if cls._instance is None:
cls._instance = cls()
# 3. 全局唯一入口:无论调用多少次,都返回同一个实例
return cls._instance
关键设计点:
_instance:私有类属性,用于缓存唯一的实例对象,PrivateAttr进一步限制了外部直接修改该属性;get_instance():类方法(@classmethod)作为全局访问入口,而非直接通过__init__实例化;- 「懒汉式」特征:实例不是在类加载时创建,而是第一次调用
get_instance()时才创建(延迟初始化,节省资源)。
二、该实现的特点与注意事项
1. 优点
- 懒加载:仅在需要时创建实例,避免程序启动时不必要的资源占用;
- 全局唯一:确保
EventBus作为「事件总线」这类核心组件,全程序共用一个实例,保证事件传递的一致性; - 访问可控:通过
get_instance()统一管理实例的创建和获取,便于后续扩展(如加锁、日志等)。
2. 潜在问题(新手需注意)
- 线程不安全:在多线程场景下,若多个线程同时调用
get_instance(),可能会创建多个实例(比如线程 A 判断_instance为 None,还没执行cls(),线程 B 也判断为 None,最终创建两个实例); - 解决方案(线程安全优化):
import threading from pydantic import PrivateAttr class EventBus(Plugin): _instance: 'EventBus' = PrivateAttr(None) _lock = threading.Lock() # 新增锁机制 @classmethod def get_instance(cls) -> 'EventBus': if cls._instance is None: # 双重检查(DCL),提升性能 with cls._lock: # 加锁保证单线程执行 if cls._instance is None: cls._instance = cls() return cls._instance
三、单例模式的适用场景
这段代码中
EventBus(事件总线)是单例模式的典型应用场景,其他适用场景还包括:- 配置管理类(全程序共用一份配置);
- 数据库连接池(避免频繁创建 / 销毁连接);
- 日志管理器(确保日志输出的一致性);
- 缓存管理器(全局缓存唯一)。
总结
- 核心模式:懒汉式单例模式(延迟初始化的单例);
- 核心逻辑:通过类属性缓存实例 + 类方法作为唯一访问入口,保证类只有一个实例;
- 注意点:基础实现线程不安全,多线程场景需加锁(双重检查锁 DCL);
- 适用场景:需要全局唯一实例的核心组件(如事件总线、配置管理、数据库连接池)。
本文来自博客园,作者:limingqi,转载请注明原文链接:https://www.cnblogs.com/limingqi/p/19733750
浙公网安备 33010602011771号