【单例模式】简介

目录

  • 概念理解
  • 使用场景
  • 优缺点
  • 实现方式

概念理解

单例模式要保证一个类在整个系统运行期间,无论创建多少次该类的对象,始终只会有一个实例存在。就像操作系统中的任务管理器,无论何时何地调用它,都是同一个任务管理器在工作,不会同时出现多个不同的任务管理器实例

使用场景

  • 资源共享:当多个模块需要共享同一个资源时,使用单例模式可以避免资源的重复创建和浪费。例如,数据库连接池,使用单例模式可以确保所有模块使用的同一个数据库连接池,避免了 多个连接池的创建,提高了资源的利用率
  • 日志记录器:在一个应用程序中,通常只需要一个日志记录器来记录系统的运行信息。使用单例模式可以确保所有模块都使用同一个日志记录器,避免了日志信息的分散和混乱
  • 配置管理:在一个系统中,配置信息通常是全局的,并且只需要一份。使用单例模式中可以确保所有模块都使用同一个配置对象,方便对配置信息进行统一管理和修改

优缺点

优点

  • 节省资源:由于只创建一个实例,减少了系统资源的开销,特别是对于一些创建和销毁开销较大的对象,如数据库连接、文件系统等。
  • 全局访问:提供了一个全局访问点,方便其他模块获取该实例,避免了在多个地方重复创建对象。
  • 数据一致性:由于所有模块都使用同一个实例,保证了数据的一致性和完整性。
    缺点
  • 违反单一职责原则:单例模式的类既负责创建实例,又负责管理实例的生命周期,违反了单一职责原则。
  • 扩展性差:由于单例模式的类只有一个实例,难以进行扩展和修改。如果需要对单例类进行扩展,可能需要修改原有的代码,不符合开闭原则。
  • 多线程问题:在多线程环境下,如果没有进行适当的同步处理,可能会导致多个线程同时创建实例,破坏单例模式的唯一性。

实现方式

懒汉式(线程不安全)

class Singleton:_instance = None@classmethoddef get_instance(cls):if cls._instance is None:cls._instance = cls()return cls._instance# 使用示例
s1 = Singleton.get_instance()
s2 = Singleton.get_instance()
print(s1 is s2)  # 输出: True

这种方式在第一次调用 get_instance 方法时才创建实例,但在多线程环境下可能会创建多个实例。
懒汉式(线程安全)

import threadingclass Singleton:_instance = None_lock = threading.Lock()@classmethoddef get_instance(cls):with cls._lock:if cls._instance is None:cls._instance = cls()return cls._instance# 使用示例
s1 = Singleton.get_instance()
s2 = Singleton.get_instance()
print(s1 is s2)  # 输出: True

通过加锁的方式保证在多线程环境下也只会创建一个实例,但每次获取实例都需要加锁,会影响性能。

饿汉式

class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super().__new__(cls, *args, **kwargs)return cls._instance# 使用示例
s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # 输出: True

这种方式在类加载时就创建实例,避免了多线程问题,但如果实例创建过程比较耗时,会影响系统的启动性能。

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

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

相关文章

目标检测YOLO实战应用案例100讲- 无人机平台下露天目标检测与计数

目录 知识储备 基于YOLOv8改进的无人机露天目标检测与计数 一、环境配置与依赖安装 二、核心代码实现(带详细注释) 1. 改进YOLOv8模型定义(添加注意力机制) 2. 无人机视角数据增强(drone_augment.py ) 3. 多目标跟踪与计数(tracking_counter.py ) 4. 完整推理流…

【在Spring Boot中集成Redis】

在Spring Boot中集成Redis 依赖在application.yml中配置Redis服务地址创建Redis配置类缓存工具类使用 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency&…

计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践

概述 设想一下&#xff0c;你在多地拥有多个仓库&#xff0c;要同时监控每个仓库的实时状况&#xff0c;这对于时间和精力而言&#xff0c;都构成了一项艰巨挑战。从成本和可靠性的层面考量&#xff0c;大规模部署计算设备也并非可行之策。一方面&#xff0c;大量计算设备的购…

通信协议记录仪-产品规格书

以下是为 ​​通信协议记录仪(ProtoLogger Pro)​​ 的​​详细产品规格书​​,覆盖 ​​技术细节、场景需求、竞品差异化​​,确保可作为产品开发、市场营销及竞品分析的核心依据。 ​​通信协议记录仪产品规格书​​ ​​产品名称​​:ProtoLogger Pro(中文名称:蹲守…

python:sklearn 决策树(Decision Tree)

5. 决策树&#xff08;Decision Tree&#xff09; - 第5章 算法思想&#xff1a;基于信息增益&#xff08;ID3&#xff09;或基尼不纯度&#xff08;CART&#xff09;递归划分特征。 编写 test_dtree_1.py 如下 # -*- coding: utf-8 -*- """ 5. 决策树&…

【2-sat】2-sat算法内容及真题

A.2-sat简介 2-sat算法可以求解给定推出关系下的一种合法情况。题目中重常常&#xff0c;给定一些布尔变量A、B、C、D…&#xff0c;再给出一系列形如 B ⟶ A , C ⟶ D B \longrightarrow A , C \longrightarrow \neg D B⟶A,C⟶D的推出关系&#xff0c;询问使得所有推出关系…

【git】获取特定分支和所有分支

1 特定分支 1.1 克隆指定分支&#xff08;默认只下载该分支&#xff09; git clone -b <分支名> --single-branch <仓库URL> 示例&#xff08;克隆 某一个 分支&#xff09;&#xff1a; git clone -b xxxxxx --single-branch xxxxxxx -b &#xff1a;指定分支…

LWIP带freeRTOS系统移植笔记

以正点原子学习视频为基础的文章 LWIP带freeRTOS系统移植 准备资料/工程 1、lwIP例程1 lwIP裸机移植 工程 &#xff0c; 作为基础工程 改名为LWIP_freeRTOS_yizhi工程 2、lwIP例程6 lwIP_FreeRTOS移植 工程 3、freeRTO源码 打开https://www.freertos.org/网址下载…

组网技术知识点

1.port-isloate enable命令用于实现两个接口之间的二层数据隔离&#xff0c;三层数据互通。 2.交换机最多支持4096个VLAN&#xff0c;编号为1-4094 3.display bfd session all&#xff1a;查看BFD会话状态是否UP 4.RJ45通过双绞线连接以太网&#xff1b; AUI端口&#xff1…

Linux系统:进程程序替换以及相关exec接口

本节重点 理解进程替换的相关概念与原理掌握相关程序替换接口程序替换与进程创建的区别程序替换的注意事项 一、概念与原理 进程程序替换是操作系统中实现多任务和资源复用的关键机制&#xff0c;允许进程在运行时动态加载并执行新程序。 1.1 定义 进程程序替换是指用新程…

从此,K8S入门0门槛!

前言 当你想要入门K8S的时候&#xff0c;往往会被各种概念搞的晕乎乎的&#xff0c;什么API Server&#xff0c;Scheduler&#xff0c;Controller manager&#xff0c;Etcd&#xff0c;Pod&#xff0c;Kubelet&#xff0c;kube-proxy&#xff0c;deployment…… 哪怕你使用了…

[Python开发] 如何用 VSCode 编写和管理 Python 项目(从 PyCharm 转向)

在 Python 开发领域,PyCharm 一直是广受欢迎的 IDE,但其远程开发功能(如远程 SSH 调试)仅在付费版中提供。为了适应服务器部署需求,很多开发者开始将目光转向更加轻量、灵活且免费扩展能力强的 VSCode。本篇文章将详细介绍,从 PyCharm 转向 VSCode 后,如何高效搭建和管理…

处方流转平台权限控制模块设计(基于RBAC模型)

这是基于笔者的一些经验设计并加以完善的方案&#xff0c;仅供参考。 处方流转平台权限控制模块设计&#xff08;基于RBAC模型&#xff09; 1. 需求分析 处方流转平台需要严格的权限控制&#xff0c;确保&#xff1a; 患者隐私数据保护处方开具、审核、调配、发药等流程的合…

基于BM1684X+RK3588的智能工业视觉边缘计算盒子解决方案

智能工业视觉边缘计算终端技术方案书‌ ‌1. 产品概述‌ 1.1 产品定位 面向工业自动化场景的高性能AI视觉处理设备集成BM1684X&#xff08;8TOPS INT8&#xff09;AI加速芯片 RK3588&#xff08;6TOPS NPU&#xff09;异构计算支持工业级多相机接入、实时缺陷检测、高精度定…

软件工程中的 QFD

: 软件工程中的 QFD 在软件工程领域,随着市场竞争的加剧和用户需求的日益复杂,如何有效地将用户需求转化为软件产品,成为软件开发团队面临的重要挑战。而质量功能部署(Quality Function Deployment,QFD)作为一种强大的工具,为这一问题提供了有效的解决方案。 一、QF…

Vue2基础速成

一、准备工作 首先下载vue2的JavaScript库&#xff0c;并且命名为vue.min.js 下载链接&#xff1a;https://cdn.jsdelivr.net/npm/vue2&#xff08;若链接失效可去vue官网寻找&#xff09; CTRLS即可下载保存 文件目录结构 二、使用操作原生DOM与使用VUE操作DOM的便捷性比较…

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(14):かもしれません (~た・~ない)ほうがいいです

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;1&#xff14;&#xff09;&#xff1a;かもしれません &&#xff08;&#xff5e;た・&#xff5e;ない&#xff09;ほうがいいです 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师…

传统银行服务和 区块链支付无缝融合的一种解决方案

Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目标是重构全球银行体系,并打造开放且无须许可的经营环境。”在 DeFi 的金融世界中,加密资产架构在区块链上,通过各个协议实现资产之间的高效转移和价值的实时流通,如 Metamask 钱包的自托管,Uniswap 的资产交易,…

基于深度学习的毒蘑菇检测

文章目录 任务介绍数据概览数据处理数据读取与拼接字符数据转化标签数据映射数据集划分数据标准化 模型构建与训练模型构建数据批处理模型训练 文件提交结果附录 任务介绍 本次任务为毒蘑菇的二元分类&#xff0c;任务本身并不复杂&#xff0c;适合初学者&#xff0c;主要亮点…

时间给了我们什么?

时间给了我们什么&#xff1f; ​春秋易逝&#xff0c;青春难留&#xff0c;转瞬之间已过半百。 ​过往中&#xff0c;有得有失&#xff0c;这就是人生。 ​一日三餐四季&#xff0c;日起日落里&#xff0c;成就了昨天、今天和明天&#xff0c;在历史长河中&#xff0c;皆是…