当前位置: 首页 > 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

要点总结

在这里插入图片描述

相关文章:

  • Docker部署与应用、指令
  • Qwen与Llama分词器核心差异解析
  • vue3学习
  • C++和C#界面开发方式的全面对比
  • 秋招Day12 - 计算机网络 - IP
  • 相机--相机成像原理和基础概念
  • 基于springboot的图书管理系统的设计与实现
  • Hadoop复习(九)
  • torch.distributed.launch 、 torchrun 和 torch.distributed.run 无法与 nohup 兼容
  • 如何制定数字化转型策略:从理念到落地的全面指南
  • 消费者行为变革下开源AI智能名片与链动2+1模式S2B2C商城小程序的协同创新路径
  • websocket协议
  • 互联网历史01
  • 阿里云为何,一个邮箱绑定了两个账号
  • 便携式雷达信号模拟器,定义复杂电磁环境模拟新标准
  • Python数据分析及可视化中常用的6个库及函数(二)
  • 关于 java:6. 反射机制
  • AI Agent开发第78课-大模型结合Flink构建政务类长公文、长文件、OA应用Agent
  • 青少年编程与数学 02-020 C#程序设计基础 18课题、项目部署
  • ArcGIS Pro字段计算器与计算几何不可用,显示灰色
  • 深圳做网站乐云seo费用优惠/百度推广个人怎么开户
  • 如何处理脓包痘痘/关键词优化排名软件推荐
  • 做教学的视频网站有哪些问题/网站开发的公司
  • 做海报用什么网站/百度推广的定义
  • 网站建设英文怎么说/seo网站优化排名
  • 专业的徐州网站开发/百度广告代理商加盟