6、【单例模式】确保了一个类在程序运行期间只有一个实例

news2024/11/17 22:21:10

你好,我是程序员雪球

在软件设计中,单例模式是一种常见的设计模式。它确保了一个类在程序运行期间只有一个实例,并提供了全局访问该实例的方式。单例模式在许多场景中都有广泛的应用,例如共享资源管理、数据库连接、日志记录器等。下面我将为你介绍:
什么是单例模式?
单例模式的优缺点;
单例模式的应用场景;
单例模式的实现方式。
 8cd95ba2aedc40878d4af98ce3164b8a.png
一、什么是单例模式?
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的方法。这个唯一的实例被所有程序部分共享,从而避免了创建多个实例所带来的资源浪费和管理复杂性。
 
二、单例模式的优缺点
学习单例模式的优点:
1. 资源管理:通过单例模式,可以有效地管理共享资源,确保在整个程序中只有一个对象实例,减少了资源消耗和内存占用。
2. 全局访问:单例模式提供了一种全局访问唯一对象的方式,使得在程序的任何地方都能够方便地获取和使用该对象。
3. 线程安全性:在多线程环境下,单例模式可以保证只有一个线程能够创建实例,避免了多线程并发访问导致的竞态条件和数据不一致问题。
4. 控制对象创建:使用单例模式可以集中管理对象的创建过程,避免了在程序的多个部分随意创建对象,提高了代码的可维护性和可控性。

 

单例模式的缺点:
1. 缺乏灵活性:由于单例模式限制了对象的创建,使得系统在某些情况下可能缺乏灵活性。如果在后续的开发中需要创建多个实例,可能需要进行较大的代码改动。
2. 耦合性高:单例模式将对象的创建和使用紧密地耦合在一起,可能导致其他模块对单例对象的依赖增加,降低了系统的可维护性和可扩展性。
3. 测试困难:在单元测试中,对单例对象的测试可能比较复杂,需要特殊的处理来模拟单例环境,增加了测试的难度。
4. 全局状态:单例对象通常具有全局状态,可能导致在多线程或分布式环境下的并发问题,需要谨慎处理线程安全性和锁的使用。
5. 不易扩展:如果单例对象的功能需要扩展或修改,可能会涉及到对单例模式的重构,增加了系统的复杂性和维护成本。

在使用单例模式时,需要权衡其优点和缺点,并根据具体的需求和场景来决定是否适合使用。同时,要注意处理好线程安全、资源管理和可扩展性等方面的问题,以确保单例模式在系统中的正确应用。在一些情况下,可以考虑使用其他设计模式或方法来替代单例模式,以满足特定的需求。

 
三、单例模式的常见实现方式
 
1. 懒汉式单例:在首次需要时才创建实例。这种方式可以避免在程序启动时就创建对象,提高了资源利用效率。但在多线程环境下需要进行线程安全的处理。
2. 饿汉式单例:在类加载时就创建实例。这种方式简单直观,但可能导致对象过早创建和资源浪费。
3. 双重检测锁:结合了懒汉式和线程安全的特点,通过两次检查确保在多线程环境下的正确创建和访问。
4. 静态内部类:利用类的静态内部类来实现单例,通过延迟初始化确保线程安全性。
5. 枚举类:利用 Java 枚举的特性实现单例,具有简洁和自动线程安全的优点。
 
四、单例模式常见的应用场景
1. 数据库连接:在数据库应用中,创建一个单例的数据库连接管理器,确保整个应用程序只有一个连接对象,避免了多次创建和释放连接的开销。
2. 配置管理:将应用程序的配置信息封装在一个单例对象中,保证整个系统使用相同的配置,避免配置不一致的问题。
3. 资源管理器:对于系统中的稀缺资源,如文件句柄、网络连接等,可以使用单例模式来进行统一管理和分配。
4. 日志记录器:通过单例模式创建一个全局的日志记录器,使系统中的所有模块都可以使用同一个日志对象,方便集中管理和维护日志。
5. 应用程序入口:将应用程序的主入口设置为单例模式,确保程序的启动、初始化等操作只执行一次,提供了一个统一的入口点。
 
这些是单例模式常见的应用场景,但实际使用场景会根据具体的项目需求和架构而有所不同。单例模式的主要目的是确保在整个系统中只有一个特定的对象实例,并提供全局访问点。根据具体情况,可以灵活运用单例模式来管理和控制资源、提供全局服务或保持系统的一致性。

总结
以上我们从4个方面了解了单例模式,我来总结一下:
什么是单例模式?
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的方法。
单例模式的优点:资源管理,全局访问,线程安全,控制对象创建;
单例模式的缺点:缺乏灵活性,耦合性高,测试困难,不易扩展,全局状态。
单例模式的实现方式:懒汉式,饿汉式,双重检测锁,静态内部类,枚举类。
单例模式常见的应用场景:数据库连接,配置管理,资源管理器,日志管理器,应用程序入口。

单例模式是一种简单而实用的设计模式,它在软件开发中具有广泛的应用。通过合理选择单例模式的实现方式,并根据具体场景进行线程安全和资源管理的考虑,可以提高代码的可维护性和性能。在实际开发中,根据需求选择合适的单例模式实现方式,并结合其他设计模式和编程技巧,能够构建出更加健壮和高效的软件系统。

如果你觉得以上内容对你有帮助,请分享给你的朋友。
为了方便你对知识的巩固,给你留下两个思考题:
1、你在工作中在什么场景用到过单例模式?
2、你在工作中有想要放弃单例模式的场景吗?为什么?
请在评论区和我一起讨论吧

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

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

相关文章

面试题:MySQL 高可用

💖 主从同步 原理 核心:二进制日志 binlog 是 MySQL 的日志,redolog 和 undolog 是 innodo 引擎的日志。 💖 分库分表 分类 问题和技术 数据一致性问题 使用分布式事务管理组件,如ShardingSphere的分布式事务功能&…

蓝桥杯第十四届C++A组(未完)

【规律题】平方差 题目描述 给定 L, R,问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 。 输入格式 输入一行包含两个整数 L, R,用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 样例输入 1 5 样例输出 …

Vue3学习笔记+报错记录

文章目录 1.创建Vue3.0工程1.1使用vue-cli创建1.2 使用vite创建工程1.3.分析Vue3工程结构 2.常用Composition2.1 拉开序幕的setup2.2 ref函数_处理基本类型2.3 ref函数_处理对象类型2.4 ref函数使用总结 1.创建Vue3.0工程 1.1使用vue-cli创建 查看vue/cli版本,确保…

51之定时器与中断系统

目录 1.定时器与中断系统简介 1.1中断系统 1.2定时器 1.2.1定时器简介 1.2.2定时器大致原理及其配置 1.2.3定时器所需的所有配置总介 2.定时器0实现LED闪烁 3.使用软件生成定时器初始化程序 1.定时器与中断系统简介 1.1中断系统 首先,我们需要来了解一下什么…

选择企业邮箱,扬帆迈向商务新纪元!

企业邮箱和个人邮箱不同,它的邮箱后缀是企业自己的域名。企业邮箱供应商一般都提供手机app、桌面端、web浏览器访问等邮箱使用途径。那么什么是企业邮箱?如何选择合适的企业邮箱?好用的企业邮箱应具备无缝迁移、协作、多邮箱管理等功能。 企…

(一)小案例银行家应用程序-介绍

案例示例如下所示: 登录之后就会出现下面所示: 项目案例流程图如下 ● 首先我们建立四个账号对象,用于登录 const account1 {owner: ItShare,movements: [200, 450, -400, 3000, -650, -130, 70, 1300],interestRate: 1.2, // %pin: 11…

算法学习系列(四十七):IDA*

目录 引言一、概念二、例题1.排书2.回转游戏 引言 之前觉得这个IDA*算法、迭代加深算法很神秘,感觉很难,其实自己学下来感觉其实不难,相反思路非常的简单,清晰明了,我觉得难是因为我之前从来都不写暴力,就…

发布自己的github项目

git下载 git关网:https://git-scm.com/ 下载后是exe文件 git安装 除了选安装地址,其他都是下一步下一步傻瓜式安装 安装好之后随便一个地方右键多了两个东西 git gui here 和git bash here git测试配置及创建github项目 右键git bash here 测试…

C语言之指针的指向地址和指针的内容总结(八十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

全国加油站分布数据/停车场分布/公园分布/景区分布/保护区分布/poi感兴趣点

加油站是指为汽车和其它机动车辆服务的、零售汽油和机油的补充站,一般为添加燃料油、润滑油等。由于加油站所销售的石油商品具有易燃爆、易挥发、易渗漏、易集聚静电荷的特性,故加油站以“安全”为第一准则。在加油站内严禁烟火,严禁从事可能…

SpringMVC --- 老杜

1、什么是SpringMVC? SpringMVC是一个基于Java实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的及部分,…

java中大型医院HIS系统源码 Angular+Nginx+SpringBoot云HIS运维平台源码

java中大型医院HIS系统源码 AngularNginxSpringBoot云HIS运维平台源码 云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务,提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工…

Gson的用法

1. 导入依赖 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version> </dependency> 2. 使用Gson进行解析 2.1 Gson解析普通对象 package com.jiang.partnetbackend.…

Studio One 6注册机下载安装激活教程

一、Studio One 6安装 StudioOne6 下载&#xff1a;https://souurl.cn/Y6ZWCY StudioOne6 Win/Mac版注册机下载&#xff1a; rack百度网盘&#xff1a;https://pan.baidu.com/s/1zX3DqXt-wsy510L1lDI7Xg 提取码&#xff1a;3phh 1.双击Studio One6安装包&#xff0c;如下图&…

Qt中的事件学习笔记

视频链接 https://www.bilibili.com/video/BV18B4y1K7Cs/?spm_id_from333.999.0.0&vd_sourcefa4ef8f26ae084f9b5f70a5f87e9e41b事件 Qt主要用来开发带窗口的应用程序&#xff0c;我们使用的窗口的应用程序都是基于时间&#xff08;比如安卓中的点击事件&#xff09;&…

【机器学习】机器学习创建算法第4篇:K-近邻算法,学习目标【附代码文档】

机器学习&#xff08;算法篇&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习算法课程定位、目标&#xff0c;K-近邻算法定位,目标,学习目标,1 什么是K-近邻算法,1 Scikit-learn工具介绍,2 K-近邻算法API。K-近邻算法&#xff0c;1.4 …

手术麻醉系统源码 医疗信息管理系统源码C#.net6.0+ vs2022,vscode+BS网页版 手麻系统源码

手术麻醉系统源码 医疗信息管理系统源码C#.net6.0 vs2022,vscodeB/S网页版 手麻系统源码 手术麻醉管理系统是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进行全程跟踪与信息管理&#xff0c;自动集成病人HIS、LIS、RIS、PACS信息&…

第四百四十三回

文章目录 1. 概念介绍2. 思路与方法2.1 整体思路2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义Action菜单"相关的内容&#xff0c;本章回中将介绍如何获取屏幕相关参数.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

【面试八股总结】进程(一)

参考资料 &#xff1a;小林Coding、阿秀、代码随想录 一、什么是进程&#xff1f; 1. 基本概念 进程是具有独立功能的程序在一个数据集合上运行的过程&#xff0c;是系统进行资源分配和调度的一个独立单位。 2. 进程控制块 系统通过进程控制块PCB描述进程的进本情况…

[Spring Cloud] gateway全局异常捕捉统一返回值

文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…