设计模式之单例模式的实现形式、弊端以及可替代的解决方案。

news2025/4/27 7:11:39

你好,我是爱养猫的程序员雪球,今天与你分享设计模式之单例模式。

5fa69a0722af4dfba50ef13d8fdb1abf.png

单例模式是指一个类只允许创建一个对象(或实例)的模式。它在很多应用场景中具有重要作用,例如处理资源访问冲突(如日志文件写入)和表示全局唯一类(如配置信息类、唯一递增 ID 号码生成器类等)。本文将介绍单例模式的实现形式、弊端以及可替代的解决方案。

单例模式的实现形式有以下四种:
1. 饿汉式:在类加载期间,就已经将 instance 静态实例初始化好了,所以 instance 实例的创建是线程安全的。但这种实现方式不支持延迟加载实例。

2. 懒汉式:只在调用 getInstance() 方法时才创建实例,支持延迟加载实例,但会导致频繁加锁、释放锁以及并发度低等问题。

3. 双重检测式:既支持延迟加载,又支持高并发度单例实现方式。只要 instance 被创建之后,再调用 getInstance() 函数都不会进入到加锁逻辑中。所以,这种方式解决了懒汉式并发度低的问题。

4. 静态内部类形式:利用 JAVA 的静态内部类来实现单例。这种实现方式,既支持延迟加载,也支持高并发,实现起来也比双重检测简单。

5. 枚举类形式:最简单的形式是基于枚举类型的单例实现。这种实现方式通过 JAVA 枚举类型本身的特性,保证了实例创建的线程安全性也实例的唯一性。

然而,单例模式存在一定的弊端:
1. 单例对 OOP 特性的支持不友好。  
2. 单例会隐藏类之间的依赖关系。  
3. 单例对代码的可扩展性不友好。  
4. 单例对代码的可测试性不友好。  
5. 单例不支持参数的构造函数。

为了解决这些问题,可以尝试以下替代方案:
1. 静态方法实现:确保全局唯一,但不解决上述问题。  
2. 工厂模式:通过工厂类创建实例,支持参数化的构造函数,解决了单例模式的部分弊端。  
3. Spring 的 IOC 容器:提供依赖注入,实现类的全局唯一性,同时支持参数化的构造函数,从根本上解决了单例模式的问题。

如果你有收获,欢迎评论,点赞,收藏加关注。

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

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

相关文章

生信分析案例 Python简明教程 | 视频12

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

安徽华云安荣获合肥市大数据企业认定

日前,合肥市数据资源局公布了2023年度合肥市大数据企业认定名单,华云安子公司安徽华云安科技有限公司(以下简称安徽华云安)被成功认定为合肥市大数据企业。 据悉,合肥市大数据企业是合肥市为扶持和鼓励大数据企业发展&…

Android 自定义带箭头对话框背景

简介 自定义drawable,带箭头对话框背景,三角形矩形组合。应用于对话框背景、提示语背景等。 可设置箭头显示方向、箭头大小、箭头导圆角尺寸、矩形尺寸、矩形导圆角尺寸、背景颜色、drawable padding值(影响宿主控件padding)。 …

欧姆龙以太网模块如何设置ip连接 Kepware opc步骤

在数字化和自动化的今天,PLC在工业控制领域的作用日益重要。然而,PLC通讯口的有限资源成为了困扰工程师们的问题。为了解决这一问题,捷米特推出了JM-ETH-CP转以太网模块,让即插即用的以太网通讯成为可能,不仅有效利用了…

排序算法之冒泡排序详解-python版

冒泡排序:通过比较2个相邻元素之间的大小,交换元素顺序,从而达到排序目的。 从百度百科摘抄下来的冒泡排序原理如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作&#xf…

ComboBox基本用法

作用:是一个下拉框,用于以下拉列表的方式展示数据。 常用属性: 常用事件: 下拉列表框内容选择变化时触发 后台代码示范: private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){//获取被选中的…

怎样优雅地增删查改(七):按用户查询

文章目录 实现使用测试 实现 定义按用户查询(IUserOrientedFilter)接口 public interface IUserOrientedFilter {public string EntityUserIdIdiom { get; }Guid? UserId { get; set; } }EntityUserIdIdiom:语义上的UserId,用于…

使用Pandas简化数据探索性分析

大家好,本文将探讨数据探索性分析的两个基本方面:数据集形状和空值。我们将深入了解Pandas如何简化这些任务,重点关注需要同时分析多个表格的情况。使用的库是pandas和tabulate。 数据集形状 要检索单个表格的形状,可以使用.sh…

「小摹AI」赋能原型设计 开放内测申请

「小摹AI」智能原型助手发布啦! 4大AI应用能力:智能原型|智能文本|智能翻译|智能填充 释放原型设计的无限潜能 摹客AI - 让设计更具创造力http://www.mockplus.cn/ai/?hmsrwencsdnAI 智能原型 催生创新,开启原型设计新境界 根据描述&…

equals与Hashcde的区别

1、equals与hashCode的区别 equals与hashcode这两个方法都是从Object类中继承过来的。 hashCode():计算出对象实例的哈希地址,并且返回该地址,称哈希函数,又称散列表。 equals():反映的是对象的内存地址或者对象的内…

uniapp canvas 生成海报 小程序码 二维码

uniapp canvas 生成超简单海报带小程序码 canvas官网链接&#xff0c;可以先看下官方介绍&#xff0c;更好理解 uniapp官网canvas介绍 一、首先自定义一个生成海报的组件 uni-xcxcanvas.vue&#xff0c;创建同名目录 模板文件代码&#xff1a; <template><view&…

AtcoderABC251场

A - Six CharactersA - Six Characters 题目大意 给定一个由小写英文字母组成的字符串S&#xff0c;S的长度在1到3之间。 打印一个长度为6的字符串&#xff0c;该字符串是S的重复。 思路分析 通过将S重复拼接6次&#xff08;如果给定原字符串最小的情况&#xff09;&#xf…

【LLM】利用RoPE不微调大模型以扩展Context长度(更新中)

note 文章目录 note一、扩展LLM的Context长度1. 常见方法2. PCW方法 二、NBCE方法三、RoPE方法四、FlashAttention方法Reference 一、扩展LLM的Context长度 1. 常见方法 扩展LLM的Context长度其实已有不少&#xff0c;但多数是通过结合检索或者摘要的方式来缩短样本的长Conte…

深入学习 Redis - 常用数据类型,结构认识

目录 一、Redis数据类型 Redis 数据类型结构简单认识 每个数据类型具体的编码方式 1.string 2.hash 3.list 4.set 5.zset 典中典&#xff1a;记数字&#xff01;&#xff01;&#xff01; 6.查看 key 对应 value 的实际编码方式 如果本文有帮助到你&#xff0c;不…

古风编曲用什么软件?水果编曲FL Studio21怎么样

古风编曲需要什么乐器&#xff1f;古风编曲多采用笙、箫、二胡、古筝、琵琶、唢呐、二胡、竹笛、马头琴等中国传统乐器。古风编曲用什么软件&#xff1f;市面上几款热门软件有FL Studio、Cubase、Logic Pro等。 古风编曲需要什么乐器 我们常说的古风歌曲&#xff0c;其实是一…

CocoaPods could not find compatible versions for pod ““:

添加新的 SDK 依赖抛出了如下异常,无法找到可兼容的版本依赖库; [!] CocoaPods could not find compatible versions for pod "HDSSup":In Podfile:HDSSupSpecs satisfying the HDSSup dependency were found, but they required a higher minimum deployment targe…

使用这些ai绘画生成器,再也不愁没有好看的壁纸了

你们最近有没有发现网上开始流行ai绘画&#xff1f;我总是能看到ai绘画出来的图片&#xff0c;犹如下面这些图片。 这些图片是不是好看到&#xff0c;可以作为头像使用了&#xff1f;它们确实是ai绘画出来的&#xff0c;不过现在ai绘画软件众多&#xff0c;你们知道哪一款好用吗…

nvm node yarn

nvm node 以及node 对应的版本的npm相关配置的整理 ##如何设置npm 全局node_modules 安装目录 你可以通过 npm 的配置来设置全局安装的 node_modules 目录。默认情况下&#xff0c;npm 全局安装的包会存储在操作系统的特定目录中&#xff0c;如在 Windows 上为 C:\Users\<…

MySQL日常操作记录

1.查看MySQL版本 select version();2.快速复制表结构&#xff0c;不包含相关主键及约束 create table user_test as select * from user where 12;3.uuid select uuid(),uuid_short();4.替换uuid()里的’-‘为’’ select replace(uuid(),-,);5.md5摘要 select md5(uuid()…

SCT52240双路 4A/4A 高速MOSFET/IGBT栅极驱动器, 可并联输出

SCT52240是是一款宽供电电压、双通道、高速、低测栅极驱动器&#xff0c;包括功率MOSFET&#xff0c;IGBT。单个通道能够提供高达4A拉电流和4A灌电流的轨到轨驱动能力&#xff0c;并实现轨到轨输出。高达24V宽电压范围提高功率器件开关瞬间栅极驱动的振铃幅值裕度。13ns输入输出…