当前位置: 首页 > news >正文

基于Python学习《Head First设计模式》第五章 单件模式

单件模式

在这里插入图片描述

初步示例

创建实例前先判断是否已创建,已有就直接返回,没有才创建
在这里插入图片描述
在这里插入图片描述

实现方式

在这里插入图片描述

类加载时创建(推荐)

在这里插入图片描述

# singleton.py
class Singleton:def __init__(self):self.value = "实例数据"_instance = Singleton()  # 模块加载时创建实例def get_instance():return _instance# 使用
from singleton import get_instance
obj1 = get_instance()
obj2 = get_instance()
print(obj1 is obj2)  # True

优点:简单、线程安全、符合Python风格。
缺点:实例在导入时立即创建(非懒加载)。

重写__new__方法

class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super().__new__(cls)return cls._instancedef __init__(self):self.value = "初始化数据"# 使用
obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2)  # True
双重检查加锁

在这里插入图片描述

import threadingclass Singleton:_instance = None_lock = threading.Lock()  # 类似 Java 的 synchronized 锁def __new__(cls):# 第一次检查(无锁)if not cls._instance:# 获取锁(类似 synchronized 块)with cls._lock:# 第二次检查(有锁)if not cls._instance:print("创建新实例")cls._instance = super().__new__(cls)# 在这里进行初始化操作cls._instance.value = "初始化数据"return cls._instancedef get_value(self):return self.value# 创建多个线程
threads = []
for i in range(5):t = threading.Thread(target=Singleton(), name=f"Thread-{i+1}")threads.append(t)t.start()# 等待所有线程完成
for t in threads:t.join()

使用类装饰器

import functoolsdef singleton(cls):_instances = {}@functools.wrapsdef wrapper(*args, **kwargs):if cls not in _instances:_instances[cls] = cls(*args, **kwargs)return _instances[cls]return wrapper@singleton
class MyClass:def __init__(self, name):self.name = name# 使用
a = MyClass("Alice")
b = MyClass("Bob")
print(a.name, b.name)  # Alice Alice
print(a is b)  # True

使用元类

class SingletonMeta(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super().__call__(*args, **kwargs)return cls._instances[cls]class Logger(metaclass=SingletonMeta):def __init__(self, log_file):self.log_file = log_file# 使用
logger1 = Logger("app.log")
logger2 = Logger("new.log")
print(logger1.log_file)  # app.log
print(logger1 is logger2)  # True

要点总结

在这里插入图片描述

http://www.lqws.cn/news/96697.html

相关文章:

  • Matlab实现LSTM-SVM回归预测,作者:机器学习之心
  • Matlab自学笔记五十七:符号运算、可变精度运算、双精度浮点型运算,三种运算精度的概念、比较、选择和应用
  • ssh登录wsl2
  • 关于 java:6. 反射机制
  • 【C++】特殊类设计
  • 开疆智能Profinet转Profibus网关连接CMDF5-8ADe分布式IO配置案例
  • 人工智能-Chain of Thought Prompting(思维链提示,简称CoT)
  • 2025 Java面试大全技术文章大纲
  • 【Linux】linux基础指令
  • 预警功能深度测评:系统如何降低设备突发故障率?
  • 职坐标IT培训:嵌入式开发C语言/硬件/RTOS路径
  • ElasticSearch+Gin+Gorm简单示例
  • 黑客利用GitHub现成工具通过DevOps API发起加密货币挖矿攻击
  • 计算机基础知识(第三篇)
  • NLP学习路线图(二十):FastText
  • VR线上展厅特点分析与优势
  • Windows Server部署Vue3+Spring Boot项目
  • 虚拟现实教育终端技术方案——基于EFISH-SCB-RK3588的全场景国产化替代
  • 连接关键点:使用 ES|QL 联接实现更丰富的可观测性洞察
  • VR教育:开启教育新时代的钥匙
  • OpenCV 滑动条调整图像对比度和亮度
  • OpenCV CUDA模块特征检测------创建Harris角点检测器的GPU实现接口cv::cuda::createHarrisCorner
  • 【运维】统信UOS操作系统aarch64自制OpenSSH 9.6p1 rpm包(含ssh-copy-id命令)修复漏洞
  • 基于 COM 的 XML 解析技术(MSXML) 的总结
  • mac下通过anaconda安装Python
  • c语言内存函数
  • Java 中执行命令并使用指定配置文件的最佳实践
  • Oracle双平面适用场景讨论会议
  • 云服务器宕机或重启后数据会丢失吗?
  • 数据驱动在线教育平台优化:用数据帮你变成“教书匠+数据控”