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

设计模式-创建型-单例模式

1. 单例模式简介

单例模式(Singleton Pattern)是一种常见的创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。在很多情况下,我们只希望某个类在整个应用程序中有一个唯一的实例,且该实例需要在整个系统中共享

单例模式的核心思想是:

  • 保证类只有一个实例:不管创建多少次,始终只有一个对象实例。
  • 提供全局访问点:通过某种方式让全局各处都能访问这个唯一的实例。

1.1 单例模式的应用场景

  • 资源共享:当系统中某些资源(如数据库连接、文件操作、线程池等)需要共享时,使用单例模式来保证它们只有一个实例。
  • 全局配置管理:例如在一个应用中有一个配置管理类,用于读取和保存系统的配置信息,使用单例模式可以确保配置管理类的实例不会被多次创建。
  • 日志管理:单例模式适用于日志管理器,在程序中仅有一个日志记录器实例,可以确保日志文件的统一管理。

2. 单例模式的实现

在 Python 中,单例模式有多种实现方式,常见的实现方式包括:通过__new__方法创建装饰器实现模块导入

2.1 通过__new__方法创建

class Singleton:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super(Singleton, cls).__new__(cls)return cls._instance# 测试饿汉式单例模式
singleton1 = Singleton()
singleton2 = Singleton()print(singleton1 is singleton2)  # 输出:True
解释:
  • __new__方法是用于创建实例的,它会在每次实例化时被调用。
  • __new__方法中,我们首先检查_instance是否为空,如果为空则创建实例并赋值给_instance。这样,无论如何,只会创建一个实例。

2.2 装饰器实现

可以使用Python的装饰器模式来实现单例模式。通过装饰器来控制类的实例化过程,确保类的实例唯一性。只要使用该装饰器,可以将任意类变为单例模式。

def singleton(cls):instances = {}def get_instance(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return get_instance@singleton
class Singleton:pass# 测试装饰器单例模式
singleton1 = Singleton()
singleton2 = Singleton()print(singleton1 is singleton2)  # 输出:True
解释:
  • singleton装饰器定义了一个instances字典,用于缓存已创建的实例。
  • 每次调用Singleton时,get_instance函数会检查是否已经有该类的实例存在,如果存在则直接返回缓存的实例,否则创建新的实例。

2.3 模块级单例

Python中的模块本身就是天然的单例。每个模块在首次导入时会被实例化,之后的导入会直接使用缓存的模块实例。这也是python常用的一种创建单例的方式。

# singleton_module.py
class Singleton:def __init__(self):print("Singleton instance created.")singleton_instance = Singleton() # singleton_module.py中先实例化,在其他模块中导入该实例# main.py
import singleton_module# 测试模块级单例模式
singleton1 = singleton_module.singleton_instance
singleton2 = singleton_module.singleton_instanceprint(singleton1 is singleton2)  # 输出:True
解释:
  • 模块本身在导入时会被加载并执行一次,这样singleton_instance就会成为一个单例实例,后续的导入会直接引用这个实例。

3. 单例模式的优缺点

3.1 优点

  • 节约内存:单例模式确保系统中只有一个实例,避免了多次创建对象带来的内存浪费。
  • 全局访问:通过单例模式提供了一个全局访问点,保证了全局共享的数据。

3.2 缺点

  • 不易于测试:单例模式难以模拟和控制单例对象,可能影响单元测试。
  • 潜在的并发问题:在多线程环境下,单例模式可能导致并发问题,需要额外的小心,避免在多线程环境中创建多个实例。
  • 违反单一职责原则:单例模式将实例的管理逻辑和业务逻辑放在同一个类中,可能导致类的职责过于庞大。

4. 结语

单例模式是一个非常常见的设计模式,广泛应用于系统中需要共享资源、配置管理、日志等场景。它通过控制实例的创建过程确保了类只有一个实例,且提供了全局访问点。理解单例模式并合理使用它可以提升代码的可维护性和灵活性。

尽管单例模式有很多优点,但也需要谨慎使用,特别是在多线程环境下,确保不会导致并发问题。此外,单例模式可能会使得代码耦合度过高,影响代码的扩展性和测试性,因此在使用时要根据实际情况权衡其利弊。

相关文章:

设计模式-创建型-单例模式

1. 单例模式简介 单例模式(Singleton Pattern)是一种常见的创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。在很多情况下,我们只希望某个类在整个应用程序中有一个唯一的实例,且该实例需要在…...

VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...

【2024最新】基于Python+Mysql+django的水果销售系统Lw+PPT

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…...

一种寻路的应用

应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节: 全国的长途车车站的数据的更新: …...

编译openssl遇到错误Parse errors: No plan found in TAP output的解决方法

在编译openssl时 tar -zxvf openssl-1.1.1p.tar.gz cd openssl-1.1.1p ./config --prefix/usr --openssldir/etc/ssl --shared zlib make make test 遇到错误 Parse errors: No plan found in TAP output 解决方法: yum install perl-Test-Simple...

一文大白话讲清楚防抖和节流,设计封装防抖和节流,以及防抖和节流的应用场景

文章目录 一文大白话讲清楚防抖和节流,设计封装防抖和节流,以及防抖和节流的应用场景1. 防抖和节流的背景2. 节流3. 节流的应用场景4. 防抖5. 防抖应用场景 一文大白话讲清楚防抖和节流,设计封装防抖和节流,以及防抖和节流的应用场…...

Windows开启IIS后依然出现http error 503.the service is unavailable

问题背景 已启用IIS服务,配置步骤可以参考Windows10 IIS Web服务器安装配置 问题描述 在这一步浏览网站时,并没有出现默认首页,而是 http error 503 the service is unavailable 问题解决 参考 成功解决http error 503.the service is un…...

C++的封装(十四):《设计模式》这本书

很多C学习者学到对C语言有一定自信后,会去读一下《设计模式》这本书。希望能够提升自己的设计水平。 据我所知,围绕C语言出了很多书。因为正好赶上泡沫经济时代。大家一拥而上,自己半懂不懂就出书,抢着出书收割读者,出…...

牛客周赛73B:JAVA

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 \hspace{15pt}小红拿到了正整数 xxx ,她希望你找到一个长度为 kkk 的区间,满足区间内恰好有 nnn 个数是 xxx 的倍数。你能帮帮她吗? 输入描述: …...

【Ubuntu 20.4安装截图软件 flameshot 】

步骤一: 安装命令: sudo apt-get install flameshot 步骤二: 设置快捷方式: Ubuntu20.4 设置菜单,点击 号 步骤三: 输入软件名称, 软件快捷命令(flameshot gui)&am…...

剑指Offer|LCR 014. 字符串的排列

LCR 014. 字符串的排列 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。 换句话说,第一个字符串的排列之一是第二个字符串的 子串 。 示例 1: 输入: s1 "ab" s2 "eidbaooo" 输出: True 解…...

【Agent】Chatbot、Copilot与Agent如何帮助我们的提升效率?

人工智能(AI)技术的迅猛发展正在深刻改变我们的生活和工作方式。你是否曾想过,未来的工作场景会是什么样子?AI的崛起不仅仅是科技的进步,更是我们生活方式的革命。今天,我们将深入探讨三种主要的AI能力&…...

QT笔记- QTreeView + QFileSystemModel 当前位置的保存与恢复 #选中 #保存当前索引

保存当前位置 QString currentPath model->filePath(view->currentIndex()); // 获得当前位置路径 恢复位置 view->setCurrentIndex(model->index(currentPath)); // 设置此路径所在位置为当前位置...

OpenResty开发环境搭建

简介 OpenResty 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。官方地址:http://openresty.org/cn/ 具备下列特点: 具备Nginx的完整功能基于Lua语言进行扩展&#…...

linux提示结构需要清理

1. df -hT 查看出问题的文件夹所在的挂载磁盘及文件格式 2. umount 挂载磁盘,如果提示在忙, lsof 目录查看正在使用的进程,将其kill掉 3. 修复磁盘 根据文件格式修复磁盘fsck.ext4 /dev/sda1 或者 xfs_repair /dev/sda1 4. 重启系统 “结构需要清理…...

【扩展卡尔曼滤波理论推导与实践】【理论】【2/3 公式推导】

目录 非线性系统泰勒展开卡尔曼滤波卡尔曼增益模型误差协方差矩阵 公式总结 本节默认你能够完整推导标准卡尔曼滤波,将会简化一些推导的描述。如果你还不会完整推导标准卡尔曼滤波,请先从 【卡尔曼滤波理论推导与实践】系列开始看起。 非线性系统 扩展…...

springboot494基于java的综合小区管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统综合小区管理系统信息管理难度大,容错率低&am…...

深度学习blog-Transformer-注意力机制和编码器解码器

注意力机制:当我们看一个图像或者听一段音频时,会根据自己的需求,集中注意力在关键元素上,以获取相关信息。 同样地,注意力机制中的模型也会根据输入的不同部分,给它们不同的权重,并集中注意力在…...

敏感词 v0.24.0 新特性支持标签分类,内置实现多种策略

开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好,我是老马。 敏感词标签分类一直是大家比较想要的一个功能特性,v0.24.0 了开始内置支持标签分类&#xff0c…...

随身 WiFi 连接 X-Wrt 共享网络与 IPv6 中继配置

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 之前分享的《随身 WiFi 通过 USB 连接路由器共享网络 扩展网络覆盖范围》介绍了随身 WiFi 通过 USB 连接到路由器共享网络,其中留下两个小问题没有解决: OpenWrt 无法识别中兴微的…...

希望中国出现越来越多的张雪!!!——他很单纯,他说,人生很短,掐头去尾,就是20-30年,为何不做一些有意义的事情呢?

重庆张雪机车工业有限公司(Chongqing Zhangxue Machinery Industry Co., Ltd.),简称:张雪机车,由成立于2024年4月2日,总部位于重庆市两江新区 [1],由张雪创立 [5],是一家主营集摩托车整车生产制造和销售服务的有限责任公司。法定代表人张雪。 [1] 2024年7月,张雪机车…...

Qwen2.5-72B大模型实战指南:GPTQ-Int4量化+128K上下文+Chainlit可视化交互全流程

Qwen2.5-72B大模型实战指南:GPTQ-Int4量化128K上下文Chainlit可视化交互全流程 1. 模型简介 Qwen2.5-72B-Instruct-GPTQ-Int4是Qwen大型语言模型系列的最新版本,代表了当前开源大模型领域的顶尖水平。这个72.7B参数的模型经过GPTQ 4-bit量化处理&#…...

工具使用指南:提升效率的关键方法与实践

在信息爆炸的今天,我们接触到的数字工具数量呈指数级增长。从文档处理到图像编辑,从项目管理到团队协作,各类工具层出不穷。然而,一个普遍现象是:许多人工具越装越多,效率却并未显著提升。问题的根源往往不…...

如何改cad文件版本?盘点三个实用方法

在日常 CAD 绘图工作中,经常会遇到高版本 CAD 文件在低版本软件中无法打开、显示异常的问题。本文为大家整理了3 种实用的 CAD 版本转换方法,包含工具批量转换与两种代码实现方式,满足不同场景下的版本转换需求。方法一:汇帮 CAD …...

OpenClaw浏览器插件开发:Qwen3-14b_int4_awq增强网页交互能力

OpenClaw浏览器插件开发:Qwen3-14b_int4_awq增强网页交互能力 1. 为什么需要浏览器插件与OpenClaw结合 作为一个长期与浏览器打交道的开发者,我经常遇到需要批量处理网页数据的场景。传统做法是写一堆油猴脚本或手动复制粘贴,直到发现OpenC…...

嵌入式Linux设备可靠升级方案设计与实践

1. 嵌入式Linux升级方案概述在嵌入式Linux设备开发中,软件升级是一个永恒的话题。作为一名嵌入式开发工程师,我经历过无数次凌晨三点被叫起来处理升级失败的痛苦经历。经过多年实践,我总结出一套同时支持本地和远程升级的可靠方案&#xff0c…...

前端高级质感按钮复用指南

前端高级质感按钮复用指南为解决项目中按钮样式混乱、交互手感不一致的问题,我们沉淀了这套克制型高级质感按钮可复用方案。 它兼顾了高级视觉层次与真实物理交互手感,无需复杂定制即可快速在项目中落地,尤其适合顶部 Tab、筛选切换、状态标签…...

LIS302DL加速度计I²C驱动库LS302i2c详解

1. LS302i2c 库概述:面向嵌入式系统的 LIS302DL IC 加速度计驱动实现LS302i2c 是一个专为 STM32 及兼容 Cortex-M 微控制器设计的轻量级、可移植 IC 接口加速度计驱动库,其核心目标是为 STMicroelectronics 的 LIS302DL 三轴数字加速度传感器提供稳定、低…...

华人辍学博士揪出Claude Code 51万行源码泄露,官方请求下架超8000个GitHub代码库并回应:这次是人为失误,无人被解雇!

整理 | 苏宓 出品 | CSDN(ID:CSDNnews) 这两天 AI 圈的热点话题,莫过于 Claude Code 51 万行核心源码意外泄露事件。而这场风波的起点,并非什么高明的黑客攻击、也没有复杂的攻击路径,而是一位安全研究员的…...

Pixel Aurora Engine惊艳案例:用单句描述生成完整RPG角色设定+立绘+装备图

Pixel Aurora Engine惊艳案例:用单句描述生成完整RPG角色设定立绘装备图 1. 像素极光引擎简介 Pixel Aurora Engine是一款革命性的AI像素艺术生成工具,它将先进的扩散模型技术与复古游戏美学完美融合。这款工具最令人惊叹的能力在于:仅需一…...