目录

什么是单例模式

能解决什么问题

使用场景

如何实现

__new__ 方法:经典又直接

装饰器:不改类本身,也能单例

模块本身就是单例

注意事项

总结


 

        你有没有过这样的困扰:

“为什么我明明只创建了一次数据库连接,程序却悄悄多了好几个?资源占满了,性能还慢了。”

        在软件世界里,有些东西,真的只需要一个就够了。这就是单例模式的世界。

什么是单例模式

        单例模式(Singleton Pattern),本质上就是 保证某个类全局只有一个实例,无论你尝试创建多少次,得到的都是同一个对象。

        形象一点:想象你家只有一台冰箱。无论家里多少人去开门、取东西,冰箱都是那一台,不会莫名其妙多出一个新冰箱。

能解决什么问题

  • 统一管理资源:比如数据库连接,创建一次就够,避免重复占用资源
  • 全局状态共享:日志记录器、配置文件、缓存对象…每个模块都能访问同一个实例
  • 保证程序稳定性:避免多对象操作同一个资源导致混乱

        简单说,单例模式让你的程序有序而高效,就像冰箱里的食物再多,也不会乱成一团。

使用场景

  • 数据库连接:你不想每次操作都重新连接数据库
  • 日志系统:程序里每个模块都能统一写入日志
  • 配置管理:整个程序共享一个配置对象,方便修改与读取
  • 缓存对象:统一存储数据,避免重复计算

        换句话说,当“唯一性”是关键时,单例就登场了

如何实现

__new__ 方法:经典又直接

class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super().__new__(cls)return cls._instancea = Singleton()
b = Singleton()
print(a is b)  # True
  • 核心理念:对象创建之前先检查“冰箱”是否存在
  • 如果存在,就直接拿来用;不存在,才创建一个

装饰器:不改类本身,也能单例

def singleton(cls):instances = {}def wrapper(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return wrapper@singleton
class MyClass:passa = MyClass()
b = MyClass()
print(a is b)  # True
  • 想象:装饰器就像一个“守门员”,保证每个类的“冰箱”只出现一次
  • 优点:无需修改类本身,易复用

模块本身就是单例

# singleton_module.py
class MySingleton:passinstance = MySingleton()
# main.py
from singleton_module import instancea = instance
b = instance
print(a is b)  # True
  • 特点:Python 模块天然单例
  • 想象一下,模块就像整个城市的唯一冰箱,大家都能直接去用

注意事项

  • 线程安全:多线程环境可能同时创建多个实例,需要加锁保护
  • 不要滥用:单例是工具,不是全局变量的万能替代
  • 继承问题:子类可能打破单例,需要特别处理

总结

单例模式就像 程序里的冰箱

  • 独一无二:全局只有一个实例
  • 高效共享:避免重复资源浪费
  • 有序管理:让全局状态清晰可控

        下次当你遇到“必须保证唯一”的场景,想想冰箱,单例模式就自然而然地闪现在脑海里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/97963.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/97963.shtml
英文地址,请注明出处:http://en.pswp.cn/web/97963.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型学习(6)Yolo V8神经网络的基础应用

Yolo V8神经网络的基础应用2024-2025年最火的目标检测神器,一篇文章让你彻底搞懂!🤩大家好呀!今天我们要聊一聊计算机视觉领域的「明星模型」——YOLO神经网络!🎯 如果你对「目标检测」这个词还比较陌生&am…

C++:imagehlp库

imagehlp库1. 简介2. 主要函数与用途2.1PE 文件解析相关2.2 符号处理相关2.3 崩溃转储相关2.4 版本资源相关3. 使用示例3.1 解析内存地址对应的函数名和行号3.2 创建目录使用示例1. 简介 imagehlp 是 Windows 系统提供的一个图像处理与调试辅助 API 库(Image Helpe…

如何在Anaconda中配置你的CUDA Pytorch cuNN环境(2025最新教程)

目录 一、简介 二、下载CUDA 三、下载Pytorch-GPU版本 四、下载CUDNN 五、总结 六、测试代码 一、简介 啥是Anaconda?啥是CUDA?啥是CUDNN?它们和Pytorch、GPU之间有啥关系? 怎么通俗解释它们三者的用途和关系? 1.GPU(图形处理单元&#xff09…

算法面试(1)-----目标检测和图像分类、语义分割的区别

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 算法描述 目标检测(Object Detection)、图像分类(Image Classification)、语义分割(Semantic Segmentation) 是计算机视…

电脑散热风扇有噪音怎么解决

一、初步检查与清理断电并拆机关闭电脑并拔掉电源,打开机箱侧板(笔记本需先拆除后盖螺丝)。操作前建议佩戴防静电手环,避免静电损坏硬件。清理风扇及散热片灰尘使用压缩空气罐从风扇进风口吹走灰尘,或用软毛刷轻轻刷去…

SeaweedFS深度解析(九):k8s环境使用helm部署Seaweedfs集群

上一篇:《SeaweedFS深度解析(八):k8s环境使用Operator部署Seaweedfs集群》 链接: link #作者:闫乾苓 文章目录k8s环境使用helm部署Seaweedfs集群准备镜像seaweed-master-localpv-storageclass.yamlseaweed-volume-lo…

MATLAB绘制一个新颖的混沌图像(新四翼混沌系统)

新四翼混沌系统:dx/dt a(y - x) yz dy/dt cx - y - xz dz/dt -bz xyMATLAB代码:function plot_novel_chaotic_system() % 参数设置 a 10; b 8/3; c 28;% 初始条件 x0 [1, 1, 1];% 时间范围 tspan [0 100];% 求解微分方程 [t, x] ode45((t, x) chaotic_system(t, x, …

金融数据---获取股票日线数据

获取股票日线的数据方式有很多,包括东方财富,同花顺,tushare,这里我们就利用东方财富的数据,是免费的开源获取,第一步先安装akshare,pip安装就可以py -m pip install akshareAkshare 股票数据获…

Mac 真正多显示器支持:TESmart USB-C KVM(搭载 DisplayLink 技术)如何实现

多显示器已经不再是奢侈品,而是专业人士提升生产力的必需工具。无论是创意设计师、股票交易员还是软件开发人员,多屏幕都能让工作流程更高效、更有条理。 然而,Mac 用户长期以来面临一个主要障碍:macOS 原生不支持多流传输&#x…

【实时Linux实战系列】静态链接与libc选择:musl vs glibc的时延权衡

背景与重要性 在实时系统开发中,选择合适的C标准库(libc)和链接方式对系统的启动时间、线程性能和内存分配效率有着显著影响。glibc和musl是两种流行的C标准库实现,它们在设计目标和性能表现上存在差异。通过对比这两种libc在启动…

Altium Designer(AD24)的三种文件组织形式,工程文件,自由文件与存盘文件

🏡《专栏目录》 目录 1,概述 2,工程文件 3,自由文件 4,存盘文件 5,文件转换 5.1,工程文件于自由文件互转换 5.2,工程文件于存盘文件互转换 6,注意事项 1,概述 本文介绍Altium Designer 24软件(后文简称AD24或软件)的三种文件组织形式,工程文件,自由文件和存盘文…

Python+Selenium实现自动化测试

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快安装selenium打开命令控制符输入:pip install -U selenium火狐浏览器安装firebug:www.firebug.com,调试所有网站语言&#xff0…

2024年CSP-X初赛真题及答案解析(6-10)

2024年CSP-X初赛真题及答案解析(6-10) 字符串abcabcabc有多少不同的非空子串?( )。 A. 24 B. 36 C. 45 D. 46 答案:A 解析: 长度 1: 3 个(a, b, c) 长度 2: 3 个(ab, bc, ca) 长度 3: 3 个(abc, bca, cab) 长度 4: 3 个(abca, bcab, cabc) 长度 5: 3 个(a…

缓存与数据库一致性的4大坑及终极解决方案

缓存雪崩、击穿、穿透全中招?别让缓存与数据库的“爱恨情仇”毁了你的系统! 你有没有经历过这样的深夜告警:Redis 响应延迟飙升,数据库 CPU 直冲 100%,接口大面积超时?一查日志,发现大量请求绕过…

基于 Python charm 库实现的一些 Pairing 密码学算法

基于 Python charm 库实现了一些 Pairing 密码学算法,放在了 https://github.com/BatchClayderman/Cryptography-Schemes 里面。 在正确部署了 Python charm 库后,所有的 Python 脚本都是独立的,即该存储库中不存在一个脚本调用另一个脚本的…

用户体验五大要点:从问题到解决方案的完整指南

在互联网产品设计和运营的过程中,用户体验(User Experience,简称 UX) 已经成为决定产品成败的关键因素。一个功能再强大的产品,如果用户用得不舒服、不信任,甚至觉得没有价值,最终都会被抛弃。那…

MySQL 外键约束:表与表之间的 “契约”,数据一致性的守护者

MySQL 外键约束:表与表之间的 “契约”,数据一致性的守护者 在 MySQL 数据库设计中,外键约束(FOREIGN KEY)是维护表之间关联关系的核心工具。它就像表与表之间的一份 “契约”,确保从表(如订单…

《投资-54》元宇宙

元宇宙(Metaverse)是一个近年来备受关注的概念,它描绘了一个虚拟与现实交融、由多个互连的3D虚拟世界组成的沉浸式数字环境。用户可以通过虚拟现实(VR)、增强现实(AR)、互联网和其他技术&#x…

【数据结构】Java集合框架:List与ArrayList

文章目录一、认识List接口1.1 List的定义与继承关系1.2 Collection接口的核心方法1.3 List接口的独特方法二、线性表与顺序表基础2.1 线性表2.2 顺序表自定义顺序表(MyArrayList)实现1. 前期准备:自定义异常类2. MyArrayList核心结构3. 工具方…

K8S里的“豌豆荚”:Pod

1. 为什么要有podPod 这个词原意是“豌豆荚”,后来又延伸出“舱室”“太空舱”等含义,你可以看一下这张图片,形 象地来说 Pod 就是包含了很多组件、成员的一种结构。之前的容器技术让进程在一个“沙盒”环境里运行,具有良好的隔离…