设计模式详解---单例模式

1. 设计模式详解

        单例模式是一种创建对象的设计模式,它确保一个类只有一个实例,并提供全局访问点以获取该实例。

        在单例模式中,类负责创建自己的唯一实例,并确保任何其他对象只能访问该实例。这对于需要共享状态或资源的情况非常有用,例如数据库连接,日志记录器或线程池。

单例模式的主要特点包括:

  1. 私有构造函数:单例类的构造函数被声明为私有,这样其他类无法直接实例化该类。

  2. 静态实例变量:单例类内部维护一个静态实例变量,用于保持对单例实例的引用。

  3. 静态获取方法:单例类提供一个静态方法,以便其他类可以通过该方法获取单例实例。通常,该方法在首次调用时会创建单例实例,并在后续调用时返回该实例。

2.单例模式代码

单例模式实现代码很简单:

/*** @Author: stukk* @Description: 单例模式* @DateTime: 2023-12-17 22:14**/
public class Singleton {private static Singleton singleton;private Singleton(){}public static Singleton getInstance() {if(singleton == null){singleton = new Singleton();}return singleton;}public void showMessage(){System.out.println("我是单例模式");}
}/*** @Author: stukk* @Description: 客户端* @DateTime: 2023-12-17 22:16**/
public class SingletonMode {public static void main(String[] args) {Singleton singleton = Singleton.getInstance();singleton.showMessage();}
}

 

3. 单例模式的多种实现方式

单例模式有多种形式,每种形式都在实现单例模式的基本原则上略有不同。

3.1. 懒汉式单例模式(Lazy Initialization):

也就是上面展示的代码

特点:在首次调用获取实例的方法时才创建单例实例

优点:延迟实例化,节省资源

缺点:需要考虑线程安全

线程安全版本:

public class LazySingleton {private static LazySingleton singleton;private LazySingleton(){}public static synchronized LazySingleton getInstance() {if(singleton == null){singleton = new LazySingleton();}return singleton;
}
3.2. 饿汉式单例模式(Eager Initialization):

特点:在类加载的时候就创建单例实例

优点:简单直接、线程安全

缺点:加载的时候就实例化,可能会实例到不需要使用的类,浪费资源

代码:

/*** @Author: stukk* @Description: 饿汉式单例模式* @DateTime: 2023-12-17 22:31**/
public class EagerSingleton {private EagerSingleton(){}private static EagerSingleton singleton = new EagerSingleton();public static EagerSingleton getInstance(){return singleton;}public void showMessage(){System.out.println("我是饿汉单例模式");}
}

3.3.双重检查锁单例模式(DCL——Double-Checked-Locking)

特点:结合了懒汉式与同步锁机制,在首次调用获取实例的方法式进行双重检查,提高性能。

优点:延迟实例化且线程安全,性能相对较高

缺点:在某些情况下可能还是会出错,比如多线程环境下的指令重排序,会导致不正确的结果。

示例代码:

/*** @Author: stukk* @Description: 双重检查锁单例模式* @DateTime: 2023-12-17 22:41**/
public class DCLSingleton {private DCLSingleton(){}private volatile static DCLSingleton dclSingleton;public static DCLSingleton getInstance(){if(dclSingleton == null){synchronized (DCLSingleton.class){if(dclSingleton == null){dclSingleton = new DCLSingleton();}}}return dclSingleton;}public void showMessage(){System.out.println("我是双重校验锁单例模式");}
}

3.4. 枚举单例模式(Enum)

特点:使用枚举类实现单例,枚举类保证只有一个实例。

优点:简单、线程安全、防止反射和序列化攻击。

示例代码:(这里以计数器为例子)

/*** @Author: stukk* @Description: 使用枚举实现* @DateTime: 2023-12-17 22:46**/
public enum EnumSingleton {INSTANCE;
//    假设是个计数器private int counter;//    私有构造函数private EnumSingleton(){counter = 0;}//    获取计数器的值public int getCounter(){return counter;}//    计数器++public void addCounter(){counter ++;}//    其他 操作public void showMessage(){System.out.println("我是枚举单例模式,此时计数器值为:"+getCounter());}
}/*** @Author: stukk* @Description: 客户端* @DateTime: 2023-12-17 22:16**/
public class SingletonMode {public static void main(String[] args) {EnumSingleton singleton = EnumSingleton.INSTANCE;singleton.showMessage();singleton.addCounter();singleton.showMessage();}
}

枚举单例模式的使用非常简单,只需要使用枚举类的名称后跟 .INSTANCE 即可获取到单例实例,无需担心线程安全性或其他实现细节。

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

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

相关文章

踩坑记录:java连接ssh的问题

目录 概述一、第一个问题解决 二、第二个问题分析解决 三、第三个问题分析解决 第四个问题解决 概述 手里有个CS架构的老系统,服务端要用SSH的方式传文件。没想到写了两天!遇到一堆问题,于是记录下。(老系统真恶心啊!…

浮点数float类型不能用“==” 否知if语句不起作用

浮点数float类型不能用“” 否知if语句不起作用 简介演练 简介 在许多编程语言中,包括Python,浮点数类型(float)的比较是有问题的。浮点数是近似表示的,因此在比较两个浮点数是否相等时可能会遇到精度问题。 比如&am…

Linux(23):Linux 核心编译与管理

编译前的任务:认识核心与取得核心原始码 Linux 其实指的是核心。这个【核心(kernel)】是整个操作系统的最底层,他负责了整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等&a…

CMA、CNAS软件检测公司分享:压力测试应关注的指标和面临的问题

软件压力测试是容易被传统企业忽视的测试点,用户人数一旦超过预期,极易造成软件产品卡顿、崩溃的情况,不利于用户正常使用,严重影响企业公信力和盈利水平。今天卓码软件测评小编来聊聊压力测试过程中应该关注的指标和会面临的问题…

PLC、RS485、变频器通讯接线图详解

plc与变频器两者是一种包含与被包含的关系,PLC与变频器都可以完成一些特定的指令,用来控制电机马达,PLC是一种程序输入执行硬件,变频器则是其中之一。 但是PLC的涵盖范围又比变频器大,还可以用来控制更多的东西&#x…

【ProcessOn】流程图咏道图Axure自定义元件使用----含流程图案例

目录 一,ProcessOn 1.1 ProcessOn是什么 1.2 ProcessOn应用场景 1.3 流程图 1.4 泳道图简介 1.5 Process网址与界面简介 二,流程图案例 2.1 门诊流程图 2.2 住院流程图 2.3 药房药库流程图 2.4 会议OA流程图 三,Axure自定义元件 …

WEB渗透—PHP反序列化(三)

Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩…

嵌入式培训-数据结构-day23-线性表

线性表 线性表是包含若干数据元素的一个线性序列 记为: L(a0, ...... ai-1, ai, ai1 ...... an-1) L为表名,ai (0≤i≤n-1)为数据元素; n为表长,n>0 时,线性表L为非空表,否则为空表。 线性表L可用二元组形式描述…

diffuser为pipeline设置不用的scheduler

查看默认的schedulers: 使用默认的schedulers生成数据 查看默认scheduler的默认配置,定义了采样器中的相关参数,网上关于DDPM和DDIM的文章较多,可以先去看看这两种schedulers: 修改scheduler,可以用于…

【总结】THUPC2024

队名:消灭智哥 队友:zbh,hrl 比赛前一天组的队。队名源于及其智慧的对面楼的宿管。 复赛就不用想了,就体验一下 ACM 的队伍赛制。 去年一题没切,被队友 szt 单人切 3 带飞。现在 szt 已经是高贵的华附哥了。 今年我…

Linux——进程地址空间与进程控制

进程地址空间与进程控制 文章目录 进程地址空间与进程控制1. 进程地址空间1.1 进程地址空间的引入1.1 进程地址空间的特点1.2 页表1.3 C/C的地址1.4 进程地址空间 页表的优势 2. 进程控制2.1 进程创建2.1.1 写时拷贝 2.2 进程终止2.2.1 进程退出码2.2.2 异常信号码2.2.3 errno…

前端对接 —— 周末

1.点击校验 点击校验 宇哥 记得过滤 不能校验的数据(我后端还要检验吗?) 2.前端数据对接 这个可以吗? 这种的可以吗?

go原生http开发简易blog(一)项目简介与搭建

文章目录 一、项目简介二、项目搭建前置知识三、首页- - -前端文件与后端结构体定义四、配置文件加载五、构造假数据- - -显示首页内容 代码地址:https://gitee.com/lymgoforIT/goblog 一、项目简介 使用Go原生http开发一个简易的博客系统,包含一下功能…

使用堆排序算法

使用堆排序算法&#xff08;升序&#xff0c;建大堆顶&#xff09;完善此程序。&#xff08;注&#xff1a;截图为堆排序初始化后的大堆顶结果&#xff0c;详见源代码&#xff09; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define N 10void input(int a[], …

【react.js + hooks】基于事件机制的跨组件数据共享

跨组件通信和数据共享不是一件容易的事&#xff0c;如果通过 prop 一层层传递&#xff0c;太繁琐&#xff0c;而且仅适用于从上到下的数据传递&#xff1b;建立一个全局的状态 Store&#xff0c;每个数据可能两三个组件间需要使用&#xff0c;其他地方用不着&#xff0c;挂那么…

MySQL日志管理,备份与恢复

备份的主要目的是灾难恢复&#xff0c;备份还可以测试应用、回滚数据修改、查询历史数据、审计等。 而备份、恢复中&#xff0c;日志起到了很重要的作用 MySQL日志管理是数据库管理中的一个重要方面&#xff0c;它可以用于诊断问题、监控性能、进行故障恢复等。MySQL主要有几种…

【合成数字】合成类游戏-uniapp项目开发流程详解

以前玩过2048游戏&#xff0c;从中发现规律&#xff0c;想到跟合成类游戏相似&#xff0c;知道为什么很相似吗&#xff0c;在这里&#xff0c;做一个数字合成游戏玩玩吧&#xff0c;感兴趣的话可以看看&#xff0c;这里给大家讲一讲数字合成游戏的开发过程。 文章目录 创建项目…

Pandas-DataFtame的索引与切片(第3讲)

Pandas-DataFtame的索引与切片(第3讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

【动态读取配置文件】ParameterTool读取带环境的配置信息

不同环境Flink配置信息是不同的&#xff0c;为了区分不同环境的配置文件&#xff0c;使用ParameterTool工具读取带有环境的配置文件信息 区分环境的配置文件 三个配置文件&#xff1a; flink.properties&#xff1a;决定那个配置文件生效 flink-dev.properties&#xff1a;测…

主持知识竞赛类节目的一般流程是什么

竞争性的团队活动&#xff0c;更适合青年的特点&#xff0c;更容易得到青年的支持&#xff0c;也是"离教于乐"的好方式。 这类活动可从内容和特点上分为知识性竞赛&#xff0c;技能性竞赛&#xff0c;文娱性竞赛&#xff0c;体育竞技性竞赛等形式。 知识性竞赛&…