Python设计模式详解之1 —— 单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。单例模式适用于需要确保全局唯一实例的场景,例如配置管理、日志记录器、数据库连接等。

1. 单例模式的特点

  • 全局唯一性:在整个应用程序的生命周期内,单例类只能有一个实例。
  • 全局访问:提供了一个全局访问点,任何地方都可以获取到该实例。
  • 延迟实例化:单例模式可以延迟实例化,即实例在第一次使用时才创建。

2. 实现单例模式的方法

在Python中,可以通过多种方式实现单例模式。以下是几种常见的方法:

方法一:使用类的静态实例
class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)return cls._instance# 测试
obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2)  # 输出: True

解释:

  • 类变量 _instance 用于保存类的唯一实例。
  • __new__ 方法在实例创建时调用,确保实例只会被创建一次。
方法二:使用装饰器
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 MyClass:pass# 测试
obj1 = MyClass()
obj2 = MyClass()
print(obj1 is obj2)  # 输出: True

解释:

  • 装饰器 singleton 用字典存储类的实例,如果实例不存在,就创建一个新的实例。
方法三:使用模块

Python模块本身就是单例的。可以直接在模块中定义全局变量来实现单例模式:

# singleton_module.py
class Singleton:def __init__(self):self.value = 42singleton_instance = Singleton()

解释:

  • 模块在首次导入时会被初始化并保持单例状态。

使用元类(metaclass)来实现单例模式是Python中特有且更高级的方式。元类是控制类创建行为的“类的类”,通过自定义元类,我们可以控制类的实例化过程来实现单例模式。

方法四:使用元类实现单例模式

使用元类实现单例模式的核心思想是在__call__方法中拦截类的实例化过程,从而确保类只有一个实例。

实现方法
class SingletonMeta(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:# 创建一个新的实例,并将其存入_instances字典中cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)return cls._instances[cls]# 使用元类实现单例模式的类
class SingletonClass(metaclass=SingletonMeta):def __init__(self):print("Instance created")# 测试
obj1 = SingletonClass()
obj2 = SingletonClass()
print(obj1 is obj2)  # 输出: True

解释

  • SingletonMeta继承自type,因此是一个元类。
  • __call__方法在类实例化时被调用。通过重写此方法,我们可以控制类实例的创建过程。
  • _instances是一个类变量,用于保存每个类的唯一实例。如果类实例不存在,则调用super().__call__()来创建一个新实例并存储在_instances中;如果已存在,直接返回存储的实例。

元类实现的优点

  • 灵活性:可以将元类应用于多个不同的类,从而减少重复代码。
  • 可扩展性:方便地在单例逻辑中添加额外功能,如线程安全控制。

3. 线程安全性改进

在多线程环境中,需要确保单例模式是线程安全的。可以使用线程锁来实现:

import threadingclass SingletonMeta(type):_instances = {}_lock = threading.Lock()  # 锁对象用于同步def __call__(cls, *args, **kwargs):with cls._lock:  # 确保线程安全if cls not in cls._instances:cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)return cls._instances[cls]class SingletonClass(metaclass=SingletonMeta):def __init__(self):print("Instance created")# 测试
obj1 = SingletonClass()
obj2 = SingletonClass()
print(obj1 is obj2)  # 输出: True

4. 应用场景

  • 日志系统:日志记录器在整个应用程序中应当只有一个实例来防止资源竞争。
  • 配置管理:使用单例模式来加载和管理配置文件以确保一致性。
  • 资源共享:在涉及共享资源如数据库连接池时,单例模式可以有效管理连接实例。

5. 注意事项

  • 单例模式的实现要保证线程安全,特别是在多线程应用中。
  • 过度使用单例模式会导致代码耦合度高,因此应谨慎使用,确保符合设计需求。

单例模式虽然简单,但其全局状态可能带来潜在的问题,例如难以进行单元测试或状态管理不清晰。在使用时要权衡利弊。

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

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

相关文章

Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式(英语&…

OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:分享|16个含源码和数据集的计算机视觉实战项目 本文将分享16个含源码和数据集的计算机视觉实战项目。具体包括: 1. 人…

Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化

Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

HarmonyOs鸿蒙开发实战(17)=>沉浸式效果第二种方案一组件安全区方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感,从而使用户获得最佳的UI体验。 2.组件安全区方案介绍 应用在默认情况下窗口背景绘制范围是全屏,但UI元素被限制在安全区内…

五天SpringCloud计划——DAY1之mybatis-plus的使用

一、引言 咱也不知道为啥SpringCloud课程会先教mybatis-plus的使用,但是教都教了,就学了吧,学完之后觉得mybatis-plus中的一些方法还是很好用了,本文作为我学习mybatis-plus的总结提升,希望大家看完之后也可以熟悉myba…

Matlab 答题卡方案

在现代教育事业的飞速发展中,考试已经成为现代教育事业中最公平的方式方法,而且也是衡量教与学的唯一方法。通过考试成绩的好与坏,老师和家长可以分析出学生掌握的知识多少和学习情况。从而老师可以了解到自己教学中的不足来改进教学的方式方…

丹摩|丹摩助力selenium实现大麦网抢票

丹摩|丹摩助力selenium实现大麦网抢票 声明:非广告,为用户体验 1.引言 在人工智能飞速发展的今天,丹摩智算平台(DAMODEL)以其卓越的AI算力服务脱颖而出,为开发者提供了一个简化AI开发流程的强…

【生成数据集EXCEL文件】使用生成对抗网络GAN生成数据集:输出生成数据集EXCEL

本文采用MATLAB编程,使用生成对抗网络GAN生成数据集:输出生成数据集EXCEL格式文件,方便大家使用。 实际工程应用中,由于经济成本和人力成本的限制,获取大量典型的有标签的数据变得极具挑战,造成了训练样本…

cocos creator 3.8 一些简单的操作技巧,材质的创建 1

这是一个飞机的3D模型与贴图 导入到cocos中,法线模型文件中已经包含了mesh、material、prefab,也就是模型、材质与预制。界面上创建一个空节点Plane,将模型直接拖入到Plane下。新建材质如图下 Effect属性选择builtin-unlit,不需…

手机领夹麦克风哪个牌子好,哪种领夹麦性价比高,热门麦克风推荐

​在如今这个科技飞速发展的时代,麦克风的选择成了很多人关心的问题,特别是无线麦克风该怎么选呢?向我咨询麦克风选购事宜的人可不在少数。要是你只是想简单自娱自乐一下,其实真没必要大费周章,直接用手机自带的麦克风…

【功能实现】bilibili顶部鼠标跟随效果怎么实现?

我们在电脑端打开b站首页时,总会被顶部【鼠标跟随】的效果所吸引,那他是如何实现的,来研究一下。 b站效果: 分析: 1.监听鼠标的位置,当悬浮到该模块时,图片会随鼠标移动 2.引入图片的样式是动…

WebStorm 安装配置(详细教程)

文章目录 一、简介二、优势三、下载四、安装4.1 开始安装4.2 选择安装路径4.3 安装选项4.4 选择开始菜单文件夹4.5 安装完成 五、常用插件5.1 括号插件(Rainbow Brackets)5.2 翻译插件(Translation)5.3 代码缩略图(Cod…

[C++]:C++11(三)

1. 可变参数模版 1.1 概念 可变参数模板允许我们定义能接受可变数目模板参数的模板。简单来说,就好比一个函数可以接受任意个数的实际参数一样,可变参数模板能应对不同数量的模板参数情况。比如,我们可以有一个模板类或者模板函数&#xff…

【Nginx从入门到精通】05-安装部署-虚拟机不能上网简单排错

文章目录 总结1、排查步骤 一、排查:Vmware网关二、排查:ipStage 1 :ping 127.0.0.1Stage 2 :ping 宿主机ipStage 3 :ping 网关 失败原因解决方案Stage 4 :ping qq.com 总结 1、排查步骤 Vmware中网关是否…

InstantStyle容器构建指南

一、介绍 InstantStyle 是一个由小红书的 InstantX 团队开发并推出的图像风格迁移框架,它专注于解决图像生成中的风格化问题,旨在生成与参考图像风格一致的图像。以下是关于 InstantStyle 的详细介绍: 1.技术特点 风格与内容的有效分离 &a…

卷积神经网络各层介绍

目录 1 卷积层 2 BN层 3 激活层 3.1 ReLU(Rectified Linear Unit) 3.2 sigmoid 3.3 tanh(双曲正切) 3.4 Softmax 4 池化层 5 全连接层 6 模型例子 1 卷积层 卷积是使用一个卷积核(滤波器)对矩阵进…

Elastic 和 Red Hat:加速公共部门 AI 和机器学习计划

作者:来自 Elastic Michael Smith 随着公共部门组织适应数据的指数级增长,迫切需要强大、适应性强的解决方案来管理和处理大型复杂数据集。人工智能 (Artificial intelligence - AI) 和机器学习 (machine learning - ML) 已成为政府机构将数据转化为可操…

SAP B1 登陆报错解决方案 - 系统架构目录服务器选择

背景 登录时出现如下报错,报错显示为【系统架构目录服务器选择】 强行登录会发现过往账套都不见了 出现原因 出于各种原因在开机时没有把 SAP 所有的服务成功启动(上一次启动科学上网后全局代理没关干净之类的)。 解决方案 关机几分钟重启…

基于深度卷积神经网络(CNN)模型的图像着色研究与应用系统实现

1.摘要 许多历史照片都是黑白的,通过颜色化可以恢复这些照片的历史感和真实感,使人们更好地理解和感受历史事件。随着深度学习技术的发展,特别是卷积神经网络和自监督学习的兴起,研究人员提出了新的方法来解决这些问题。通过将颜色…