6、【单例模式】确保了一个类在程序运行期间只有一个实例
你好,我是程序员雪球
在软件设计中,单例模式是一种常见的设计模式。它确保了一个类在程序运行期间只有一个实例,并提供了全局访问该实例的方式。单例模式在许多场景中都有广泛的应用,例如共享资源管理、数据库连接、日志记录器等。下面我将为你介绍:
什么是单例模式?
单例模式的优缺点;
单例模式的应用场景;
单例模式的实现方式。

一、什么是单例模式?
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的方法。这个唯一的实例被所有程序部分共享,从而避免了创建多个实例所带来的资源浪费和管理复杂性。
二、单例模式的优缺点
学习单例模式的优点:
1. 资源管理:通过单例模式,可以有效地管理共享资源,确保在整个程序中只有一个对象实例,减少了资源消耗和内存占用。
2. 全局访问:单例模式提供了一种全局访问唯一对象的方式,使得在程序的任何地方都能够方便地获取和使用该对象。
3. 线程安全性:在多线程环境下,单例模式可以保证只有一个线程能够创建实例,避免了多线程并发访问导致的竞态条件和数据不一致问题。
4. 控制对象创建:使用单例模式可以集中管理对象的创建过程,避免了在程序的多个部分随意创建对象,提高了代码的可维护性和可控性。
单例模式的缺点:
1. 缺乏灵活性:由于单例模式限制了对象的创建,使得系统在某些情况下可能缺乏灵活性。如果在后续的开发中需要创建多个实例,可能需要进行较大的代码改动。
2. 耦合性高:单例模式将对象的创建和使用紧密地耦合在一起,可能导致其他模块对单例对象的依赖增加,降低了系统的可维护性和可扩展性。
3. 测试困难:在单元测试中,对单例对象的测试可能比较复杂,需要特殊的处理来模拟单例环境,增加了测试的难度。
4. 全局状态:单例对象通常具有全局状态,可能导致在多线程或分布式环境下的并发问题,需要谨慎处理线程安全性和锁的使用。
5. 不易扩展:如果单例对象的功能需要扩展或修改,可能会涉及到对单例模式的重构,增加了系统的复杂性和维护成本。
在使用单例模式时,需要权衡其优点和缺点,并根据具体的需求和场景来决定是否适合使用。同时,要注意处理好线程安全、资源管理和可扩展性等方面的问题,以确保单例模式在系统中的正确应用。在一些情况下,可以考虑使用其他设计模式或方法来替代单例模式,以满足特定的需求。
三、单例模式的常见实现方式
1. 懒汉式单例:在首次需要时才创建实例。这种方式可以避免在程序启动时就创建对象,提高了资源利用效率。但在多线程环境下需要进行线程安全的处理。
2. 饿汉式单例:在类加载时就创建实例。这种方式简单直观,但可能导致对象过早创建和资源浪费。
3. 双重检测锁:结合了懒汉式和线程安全的特点,通过两次检查确保在多线程环境下的正确创建和访问。
4. 静态内部类:利用类的静态内部类来实现单例,通过延迟初始化确保线程安全性。
5. 枚举类:利用 Java 枚举的特性实现单例,具有简洁和自动线程安全的优点。
四、单例模式常见的应用场景
1. 数据库连接:在数据库应用中,创建一个单例的数据库连接管理器,确保整个应用程序只有一个连接对象,避免了多次创建和释放连接的开销。
2. 配置管理:将应用程序的配置信息封装在一个单例对象中,保证整个系统使用相同的配置,避免配置不一致的问题。
3. 资源管理器:对于系统中的稀缺资源,如文件句柄、网络连接等,可以使用单例模式来进行统一管理和分配。
4. 日志记录器:通过单例模式创建一个全局的日志记录器,使系统中的所有模块都可以使用同一个日志对象,方便集中管理和维护日志。
5. 应用程序入口:将应用程序的主入口设置为单例模式,确保程序的启动、初始化等操作只执行一次,提供了一个统一的入口点。
这些是单例模式常见的应用场景,但实际使用场景会根据具体的项目需求和架构而有所不同。单例模式的主要目的是确保在整个系统中只有一个特定的对象实例,并提供全局访问点。根据具体情况,可以灵活运用单例模式来管理和控制资源、提供全局服务或保持系统的一致性。
总结
以上我们从4个方面了解了单例模式,我来总结一下:
什么是单例模式?
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的方法。
单例模式的优点:资源管理,全局访问,线程安全,控制对象创建;
单例模式的缺点:缺乏灵活性,耦合性高,测试困难,不易扩展,全局状态。
单例模式的实现方式:懒汉式,饿汉式,双重检测锁,静态内部类,枚举类。
单例模式常见的应用场景:数据库连接,配置管理,资源管理器,日志管理器,应用程序入口。
单例模式是一种简单而实用的设计模式,它在软件开发中具有广泛的应用。通过合理选择单例模式的实现方式,并根据具体场景进行线程安全和资源管理的考虑,可以提高代码的可维护性和性能。在实际开发中,根据需求选择合适的单例模式实现方式,并结合其他设计模式和编程技巧,能够构建出更加健壮和高效的软件系统。
如果你觉得以上内容对你有帮助,请分享给你的朋友。
为了方便你对知识的巩固,给你留下两个思考题:
1、你在工作中在什么场景用到过单例模式?
2、你在工作中有想要放弃单例模式的场景吗?为什么?
请在评论区和我一起讨论吧
相关文章:
6、【单例模式】确保了一个类在程序运行期间只有一个实例
你好,我是程序员雪球 在软件设计中,单例模式是一种常见的设计模式。它确保了一个类在程序运行期间只有一个实例,并提供了全局访问该实例的方式。单例模式在许多场景中都有广泛的应用,例如共享资源管理、数据库连接、日志记录器等…...
vuex插件实现数据共享
vuex插件 vuex是管理多个vue通用的数据的插件.(状态管理工具,状态是数据) 我们对于多个vue文件之间的共同数据,是用props传递,或者对于一个vue实例对象,进行绑定,传参,也是多次传参,多个文件之间,比较麻烦. 但是我们vuex会创建一个公共对象,从这个公共对象上赋值,比较简单易…...
【吊打面试官系列】Redis篇 - 使用过 Redis 分布式锁么,它是什么回事?
大家好,我是锋哥。今天分享关于 【使用过 Redis 分布式锁么,它是什么回事?】面试题,希望对大家有帮助; 使用过 Redis 分布式锁么,它是什么回事? 先拿 setnx 来争抢锁,抢到之后&#…...
DashOJ-8.奇偶统计
题目链接: 题目详情 - 奇偶统计 - DashOJ 思路: (while循环加if分支语句) 巧用死循环 while(1) 然后在里面第一句就判断输入的数字是否等于0 if(x0) ,如果 等于0就直接break跳出循环 或者用 while(cin>>x) 代…...
车源宝微信小程序源码
源码介绍 车源宝微信小程序源码 images — 存放项目图片文件 pages — 存放项目页面相关文件 store — 存放数据接口文件 utils — 存放时间格式化等文件 演示截图 源码下载 https://download.csdn.net/download/huayula/89082980...
“双碳”目标下资源环境中的可计算一般均衡(CGE)模型应用
我国政府承诺在2030年实现“碳达峰”,2060年实现“碳中和”,这就是“双碳”目标。为了实现这一目标就必须应用各种二氧化碳排放量很高技术的替代技术,不仅需要考虑技术上的可靠性,也需要考虑经济上的可行性。可计算一般均衡模型&a…...
在 Git Bash 中调整字体大小,可以按照以下步骤进行操作,注意这里是linux虚拟机,命令都是Linux方式的
在 Git Bash 中调整字体大小,可以按照以下步骤进行操作: 打开 Git Bash 终端。 在终端中,点击顶部菜单栏的 "Options"(选项)。 在弹出的下拉菜单中,选择“text”文本 右侧font那里…...
STM32之HAL开发——不同系列SPI功能对比(附STM32Cube配置)
不同系列STM32——SPI框图 F1系列框图 F4系列框图 TI模式时序图特性 F7系列框图 H7系列框图 注意:F7系列以及H7系列支持Quad-SPI模式,可以连接单,双或者四条数据线的Flash存储介质。 SPI——Cube配置流程 RCC时钟源配置 SYS系统调试模式配…...
Codeforces Round 836 (Div. 2) D. Range = √Sum
题目 思路: #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…...
阿里云python-SDK配置
OSS管理控制台 (aliyun.com) SDK地址 GitHub - aliyun/aliyun-oss-python-sdk: Aliyun OSS SDK for Python 下载文件并运行 python setup.py install oss2包配置完成。 上传、下载开发文档: Python SDK快速入门_对象存储(OSS)-阿里云帮助中心 (aliyun.com)...
深入理解MP4视频文件裁剪原理[下下]
深入理解MP4视频文件裁剪原理[上] 深入理解MP4视频文件裁剪原理[中] 深入理解MP4视频文件裁剪原理[下] 深入理解MP4视频文件裁剪原理[下下] 3.22 stco box* stco box记录了每个chunk在MP4文件中的偏移量。如下图24: 图24 这里的offset指的是chunk的起始位置相对于整个MP4文…...
Java中copy 一个list,不用BeanUtils.copyProperties
1.List不起作用(单个对象拷贝有用,list没有用) cn.hutool.core.bean.BeanUtils.copyProperties(a, b); org.springframework.beans.BeanUtils.copyProperties(a, b); 2.有效(使用JSONObject 先转成字符串再转成List对象&#x…...
Vue3中props和emits的使用总结
Vue3中props和emits的使用介绍 1,看代码1.1,App.vue1.2,TodoItem.vue 2,总结2.1 props2.2 emits 1,看代码 1.1,App.vue <script setup> import { ref,reactive } from vue import TodoItem from ./…...
HUAWEI 华为交换机 配置 Eth-Trunk 接口流量本地优先转发示例(堆叠)
组网需求 说明 S5720I-10X-PWH-SI-AC 和 S5720I-6X-PWH-SI-AC 不支持此配置。 如 图 3-23 所示,为了增加设备的容量采用设备堆叠技术,将 Switch3 和 Switch4通过专用的堆叠电缆链接起来,对外呈现为一台逻辑交换机。为了实现设备间的备份、…...
MySQL 优化及故障排查
目录 一、mysql 前置知识点 二、MySQL 单实例常见故障 故障一 故障二 故障三 故障四 故障五 故障六 故障七 故障八 三、MySQL 主从故障排查 故障一 故障二 故障三 四、MySQL 优化 1.硬件方面 (1)关于 CPU (2)关…...
H12-821_182
182.当0SPF运行在广播型网络中时,需要选举DR和BDR。那么以下哪一种状态会进行DR和BDR的选举? A.2-way B.Full C.Exchange D.Init 答案:A 注释: 每台路由器发送的hello报文都有DR字段和BDR字段。 路由器接口刚开始运行OSPF时,在等…...
IF语句
目录 if...then 数字大小的比较 if...then...else 比较两个数字的大小 if...then...elsif 根据输入的数字大小,判断学生成绩范围(优:90~100;良:80~89;中:70~79;及格࿱…...
AttributeError: module ‘wandb‘ has no attribute ‘init‘解决办法
安装对应的库 pip install wandb -i https://pypi.tuna.tsinghua.edu.cn/simple拓展——wandb是什么模块,有什么作用 wandb是一个用于跟踪、可视化和协作机器学习项目的工具。它提供了许多功能,包括实时的指标跟踪、超参数调整、模型的可视化等&#x…...
javaScript中微任务宏任务详解
在 JavaScript 中,任务分为两种类型:微任务(Microtask)和宏任务(Macrotask)。它们的执行顺序以及在事件循环(Event Loop)中的位置不同。 微任务(Microtask)&…...
牛客小白月赛90
title: 牛客小白月赛90 date: 2024-04-05 21:37:01 tags: 赛后思考与总结 categories: 比赛 A 思路 按题意直接累加就行 代码 int n; cin >> n;int m; cin >> m;ll ans 0;vector<int> a(n 1);for(int i 1; i < n ; i ) cin >> a[i];for(int i …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
