【24种设计模式】单例模式(Singleton Pattern)

当我们需要确保一个类只有一个实例时,可以使用单例模式。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

单例模式有多种实现方式,包括饿汉式、懒汉式和双重检查锁等。下面我们将分别介绍这些实现方式的特点和示例。

饿汉式单例模式

饿汉式单例模式在类加载时就创建了实例,因此它是线程安全的。具体实现如下:

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {// 私有构造函数}public static Singleton getInstance() {return instance;}
}

在这个示例中,我们将构造函数设为私有,防止其他类直接创建该类的实例。然后,我们在类中定义一个私有静态变量 instance,并在类加载时进行初始化。最后,我们提供一个公共的静态方法 getInstance() 来获取该实例。

懒汉式单例模式

懒汉式单例模式延迟创建实例,只有在第一次使用时才进行初始化。懒汉式单例模式可能存在线程安全问题,因此需要考虑多线程环境下的实现。下面是一种线程安全的懒汉式单例模式实现方式:

public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有构造函数}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

在这个示例中,我们将构造函数设为私有,防止其他类直接创建该类的实例。然后,我们定义一个私有静态变量 instance,并使用 volatile 关键字来确保多线程环境下的可见性。在 getInstance() 方法中,我们使用双重检查锁机制来确保只有在实例为 null 时才进行初始化。

双重检查锁单例模式

双重检查锁单例模式是懒汉式单例模式的改进,它通过减少同步的次数来提高性能。具体实现如下:

public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有构造函数}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

在这个示例中,我们使用了双重检查锁机制,首先检查实例是否已经被创建,如果没有,则进入同步块。在同步块内部,再次检查实例是否已经被创建,如果没有,则创建实例。这样可以减少同步的次数,提高性能。

无论是饿汉式、懒汉式还是双重检查锁单例模式,它们都可以确保一个类只有一个实例,并提供一个全局访问点来获取该实例。选择适合的单例模式实现方式取决于实际需求和性能考虑。单例模式在许多场景中都有应用,例如日志记录器、数据库连接池等。
当我们需要确保一个类只有一个实例时,可以使用单例模式。单例模式具有以下特点和应用场景:

  1. 特点:

    • 单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
    • 单例类的构造函数必须是私有的,以防止其他类直接创建实例。
    • 单例类通过静态方法或枚举实现全局访问点。
  2. 应用场景:

    • 日志记录器:在多个地方记录日志时,使用单例模式可以确保只有一个日志记录器实例,方便统一管理和控制日志输出。
    • 配置信息管理器:在应用程序中,通常会有一些全局的配置信息,使用单例模式可以确保只有一个配置信息管理器实例,方便读取和修改配置信息。
    • 数据库连接池:在高并发的情况下,使用单例模式可以确保只有一个数据库连接池实例,避免创建过多的数据库连接,提高性能和资源利用率。
    • 缓存:在需要缓存数据的场景中,使用单例模式可以确保只有一个缓存实例,方便统一管理和操作缓存数据。
    • 线程池:在需要管理线程的场景中,使用单例模式可以确保只有一个线程池实例,方便统一管理和调度线程任务。

除了上述应用场景,单例模式在许多其他情况下也有应用。它可以提供全局的访问点,方便对实例进行控制和操作。同时,单例模式还可以节省系统资源,避免创建过多的实例。

需要注意的是,单例模式可能会造成全局状态的存在,增加了程序的耦合性。因此,在使用单例模式时需要慎重考虑,确保真正需要全局唯一实例的场景才使用。此外,如果单例类的实例需要进行资源释放或销毁,需要额外考虑实现方式,以免造成资源泄露或内存泄露的问题。

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

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

相关文章

3ds Max2023安装教程(最新最详细)

目录 一.简介 二.安装步骤 软件:3ds Max版本:2023语言:简体中文大小:6.85G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU3GHz 内存16G(或更高)下载通道①百度网盘丨64位下载链接: …

Vue中的加密方式(js-base64、crypto-js、jsencrypt、bcryptjs)

目录 1.安装js-base64库 2. 在Vue组件中引入js-base64库 3.使用js-base64库进行加密 4.Vue中其他加密方式 1.crypto-js 2.jsencrypt 3.bcryptjs 1.安装js-base64库 npm install js-base64 --save-dev 2. 在Vue组件中引入js-base64库 import { Base64 } from js-ba…

Shopee买家通系统全自动化操作简单方便又快速

Shopee买家通系统是一款专门针对虾皮买家号所开发的全自动化操作系统,可以自动注册、自动加购加心愿单、自动下单等。 1、全自动化注册 准备好账号需要的资料后即可运行注册任务,程序运行时可以自动输入手机号、自动接收短信、自动输入账号密码。账号支…

用Visual Studio(VS)开发UNIX/Linux项目

目录 FTP是免不了的 正确设置头文件 组织项目结构 创建何种项目类型 FTP自动上传 大部分具有Windows开发经验的程序员会比较喜欢使用Visual Studio,而大部分Unix/Linux程序员则喜欢使用UltraEdit直接在主机上写代码。 为什么直接在主机上写代码呢,因…

FlutterUnit 周边 | 收录排序算法可视化

theme: cyanosis 1. FlutterUnit 更新:排序算法可视化 排序算法可视化是用视图层表现出算法执行过程中排序的过程,感谢 编程的平行世界 在 《十几种排序算法的可视化效果,快来看看!👀》》 一文中提供的算法支持。我进行…

单目3D目标检测[基于深度辅助篇]

基于深度辅助的方法 1. Pseudo-LiDAR Pseudo-LiDAR from Visual Depth Estimation: Bridging the Gap in 3D Object Detection for Autonomous Driving康奈尔大学https://zhuanlan.zhihu.com/p/52803631 首先利用DRON或PSMNET从单目 (Monocular)或双目 (Stereo)图像获取对应的…

dijkstra算法python

Dijkstra算法是一种用于寻找带权重图中从一个起始节点到其他节点的最短路径的算法。下面是一个使用Python实现Dijkstra算法的示例代码: import heapq def dijkstra(graph, start): # 创建一个字典来存储节点到起始节点的最短距离 distances {node: float(infinity)…

设计院图纸加密防泄密方案——天锐绿盾加密软件@德人合科技

天锐绿盾是一款专业的企业信息化防泄密软件,主要针对文档全生命周期进行加密保护,包括创建、修改、传输、归档、分发、销毁等全过程。它可以加强外发数据及终端离线的管理,对正常授权外带范围内的数据流程进行规范。设计图纸、文档等成果数据…

(免费领源码)java#Springboot#mysql装修选购网站99192-计算机毕业设计项目选题推荐

摘 要 随着科学技术,计算机迅速的发展。在如今的社会中,市场上涌现出越来越多的新型的产品,人们有了不同种类的选择拥有产品的方式,而电子商务就是随着人们的需求和网络的发展涌动出的产物,电子商务网站是建立在企业与…

顺序表的定义与实现(数据结构与算法)

一、顺序表的定义 1. 顺序表的定义 #define MaxSize 10 //定义最大长度 typedef struct{ ElemType data[MaxSize]; //用静态的“数组”存放数据元素int length; //顺序表的当前长度 …

Ubuntu设置允许root用户登录

1、激活root用户 sudo passwd root //设置root密码 su root //接着使用root登录 2、设置允许root通过ssh登录 nano /etc/ssh/sshd_config 将 PermitRootLogin 改为 yes 3、重启ssh service ssh restart 到这里就好了

SparkSQL的Shuffle分区设定及异常数据处理API(去重、缺失值处理)

一、Spark SQL的Shuffle分区数目设定 二、异常数据处理API (1)去重方法dropDuplicates (2)删除有缺失值的行方法dropna (3)填充缺失值数据fillna 一、Spark SQL的Shuffle分区数目设定 在允许spark程序时&a…

德语中第二虚拟式在主动态的形式,柯桥哪里可以学德语

德语中第二虚拟式在主动态的形式 1. 对于大多数的动词,一般使用这样的一般现在时时态: wrde 动词原形 例句:Wenn es nicht so viel kosten wrde, wrde ich mir ein Haus am Meer kaufen. 如果不花这么多钱,我会在海边买一栋房…

8. Cesium中的camera

1. 介绍 camera是viewer.scene中的属性,用来控制当前的可见域。viewer.camera 是快捷写法,访问的是 viewer.scene.camera,所以调用时这两种写法都行。介绍常用的view.carmera方法。 (1). setView Camera根据视图位置…

React 在非组件环境切换路由

我的react-router-dom版本是6.16.0。之前在react中是这样配置路由的 App.jsx import ReactDOM from react-dom/client; import { HashRouter, Route, Routes } from react-router-dom;const root ReactDOM.createRoot(document.getElementById("app")); root.rend…

Python实验项目4 :面对对象程序设计

1:运行下面的程序,回答问题。 (1)说明程序的执行过程; (2)程序运行结果是什么? # (1)说明程序的执行过程; # (2)程序运行…

android开发使用OkHttp自带的WebSocket实现IM功能

一、背景 android app开发经常会有IM需求,很多新手不晓得如何入手,难点在于通讯不中断。其实android发展到今天,很多技术都很完善,有很多类似框架可以实现。例如有:okhttp自带的websocket框架、easysocket等等。本文主…

vite工具官方地址 +前端工具插件

该项目与 Vite 一起提供服务和捆绑。推荐的 IDE 设置是 ** VSCode Volar。 **如果您需要测试组件和网页,请查看赛普拉斯和赛普拉斯组件测试。 有关更多说明,请参见。README.md vite官方地址

如何做一个无符号数识别程序

1.状态分析 我们可以把无符号数分为:整数,带小数,带指数部分三种形式。以此构建一个DFA。首先需识别输入是整数还是小数点,若是整数部分输入然后还要再循环识别一次是否有小数点,最后识别是否有指数部分,指…

Spring学习笔记—JDK动态代理

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Spring专栏 ✨特色专栏: M…