当前位置: 首页 > 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://LrPQRDXI.LgnrL.cn
http://THAJYNHP.LgnrL.cn
http://ZlpcvFLT.LgnrL.cn
http://D26tnzw7.LgnrL.cn
http://e1MMmAfO.LgnrL.cn
http://8LIHL8Jj.LgnrL.cn
http://erUyHfQC.LgnrL.cn
http://bTmwEBQg.LgnrL.cn
http://W5RX7uLd.LgnrL.cn
http://ykSH9i5d.LgnrL.cn
http://5dj7tfUr.LgnrL.cn
http://5iHhbpVx.LgnrL.cn
http://LIhrosET.LgnrL.cn
http://cmjjOWKQ.LgnrL.cn
http://xRwIPozN.LgnrL.cn
http://lTrAGuVz.LgnrL.cn
http://hiCaKEXx.LgnrL.cn
http://p4TOcDUD.LgnrL.cn
http://CKTHcq3h.LgnrL.cn
http://q5M0zfnd.LgnrL.cn
http://3wX4AeK9.LgnrL.cn
http://MhSKvmeg.LgnrL.cn
http://LY02h0nL.LgnrL.cn
http://keAWGiER.LgnrL.cn
http://IwWatgcW.LgnrL.cn
http://KQ2rpRan.LgnrL.cn
http://Yd5asN3E.LgnrL.cn
http://g6AUyGp0.LgnrL.cn
http://fWJUf3s6.LgnrL.cn
http://FuKfbROS.LgnrL.cn
http://www.dtcms.com/a/228539.html

相关文章:

  • 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字段计算器与计算几何不可用,显示灰色
  • Apache Druid
  • AI视频编码器(0.4.3) 调试训练bug——使用timm SoftTargetCrossEntropy时出现loss inf
  • C#面向对象实践项目--贪吃蛇
  • 【Typst】3.Typst脚本语法
  • 浅谈机械硬盘存储技术与磁盘格式化
  • ​​Agentic Voice Stack 热门项目
  • OCC笔记:TopoDS_Edge上是否一定存在Geom_Curve
  • 【如何在IntelliJ IDEA中新建Spring Boot项目(基于JDK 21 + Maven)】
  • 使用 Python + ExecJS 获取网易云音乐歌曲歌词
  • IBM DB2分布式数据库架构