设计模式详解---单例模式
1. 设计模式详解
单例模式是一种创建对象的设计模式,它确保一个类只有一个实例,并提供全局访问点以获取该实例。
在单例模式中,类负责创建自己的唯一实例,并确保任何其他对象只能访问该实例。这对于需要共享状态或资源的情况非常有用,例如数据库连接,日志记录器或线程池。
单例模式的主要特点包括:
-
私有构造函数:单例类的构造函数被声明为私有,这样其他类无法直接实例化该类。
-
静态实例变量:单例类内部维护一个静态实例变量,用于保持对单例实例的引用。
-
静态获取方法:单例类提供一个静态方法,以便其他类可以通过该方法获取单例实例。通常,该方法在首次调用时会创建单例实例,并在后续调用时返回该实例。
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 即可获取到单例实例,无需担心线程安全性或其他实现细节。

相关文章:
设计模式详解---单例模式
1. 设计模式详解 单例模式是一种创建对象的设计模式,它确保一个类只有一个实例,并提供全局访问点以获取该实例。 在单例模式中,类负责创建自己的唯一实例,并确保任何其他对象只能访问该实例。这对于需要共享状态或资源的情况非常有…...
毕设之-Hlang后端架构-双系统交互
文章目录 前言交互流程基本流程约定公钥人人中台携带公钥获取私钥私钥生成人人中台携带私钥访问私钥验证(博客系统) 调试演示总结 前言 前天我们完成了基本的整合,但是还没有整合到我们的业务系统,也就是博客系统。本来昨天要搞一…...
什么同源策略?
同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能,非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的,但是请求返回…...
破译模式:模式识别在计算机视觉中的作用
一、介绍 在当代数字领域,计算机视觉中的模式识别是关键的基石,推动着众多技术进步和应用。本文探讨了计算机视觉中模式识别的本质、方法、应用、挑战和未来趋势。通过使机器能够识别和解释视觉数据中的模式,模式识别不仅推动了计算机视觉领域…...
c语言-全局变量与局部变量
目录 1、(作用)域的概念 2、全局与局部的相对性 3、生命周期 3、静态变量static 结语: 前言: 在c语言中,全局变量的可见范围是整个工程,而局部变量的可见范围从该变量被定义到该作用域结束,…...
【Spring】00 入门指南
文章目录 1.简介2.概念1)控制反转(IoC)2)依赖注入(DI) 3.核心模块1)Spring Core2)Spring AOP3)Spring MVC4)Spring Data5)Spring Boot 4.编写 Hel…...
BIM 技术:CIM (City Information Modeling) 1-7 级
本心、输入输出、结果 文章目录 BIM 技术:CIM (City Information Modeling) 1-7 级前言城市信息模型(CIM)概述城市信息模型分级介绍CIM 1CIM 2CIM 3CIM 4CIM 5CIM 6CIM 7 花有重开日,人无再少年实践是检验真…...
c++ websocket 协议分析与实现
前言 网上有很多第三方库,nopoll,uwebsockets,libwebsockets,都喜欢回调或太复杂,个人只需要在后端用,所以手动写个; 1:环境 ubuntu18 g(支持c11即可) 第三方库:jsoncpp,openssl 2:安装 jsoncpp 读取json 配置文件 用 自动安装 网…...
kali虚拟机无网络
1.查看虚拟机的网卡模式 在虚拟机设置里,一般选择桥接模式,也可以选择NAT模式。 2、你的IP地址是否写死了(设置为静态IP) vim编辑模式下的命令: 按a或i进入编辑模式,然后按esc键退出编辑模式,s…...
Unity2023.3(Unity6)版本开始将可以发布WebGPU
翻译一段官网上的话: 利用Unity 2023.3(正式发布时应该称为Unity6)中最新的WebGPU图形API集成,尝试最大限度的提升您的网络游戏的真实感。 通过与谷歌的战略合作,Unity实时3D平台的强大的图形功能现在为图形丰富的网络游戏进行微调࿰…...
计算机网络期末考试A卷及答案
一、选择题(30分,每题1分) 世界上第一个网络系统是( C )。 A、ENIAC B、以太网 C、ARPANET D、DECNET 2.在常用的传输介质中,( C )的带宽最宽、信号传输衰减最小、抗干扰能力最强。 A.双绞线 …...
<蓝桥杯软件赛>零基础备赛20周--第10周--二分
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周(读者可以按…...
C++友元类,工厂模式和继承的融合案例
//友元没有继承性,没有传递性,所以在animal中定义友元类是无效的class animal{public:animal(){};virtual ~animal(){};};class Cat:public animal{friend class animalFactory;private:Cat(){}private:string m_name;string m_color;public:void about(){cout<&…...
使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值
使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值 JavaScript 中的 ?? 运算符称为 nullish 合并运算符。该运算符接受任一侧的操作数,并且仅当左侧操作数为空值时才返回右侧操作数。这个运算符绝对是一个较新的运算符,它是在 ES2020 …...
Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
问题描述:Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7 最近在学习如何将YOLO部署在手机端,出现了许多错误,下面这个错误是手机和电脑连结之后,点击run之后出现的错误。 解决办法:将JDK版本将为…...
Python Django Suit:构建现代化的Django后台管理
概要 Django Suit是一款为Django后台管理提供现代、优雅界面的第三方应用,它致力于提升Django开发者的管理体验。本文将深入介绍Django Suit的安装、配置和高级功能,提供详实的示例代码,帮助大家更好地使用和定制Django后台管理界面。 安装与…...
电子学会C/C++编程等级考试2021年09月(六级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双端队列 定义一个双端队列,进队操作与普通队列一样,从队尾进入。出队操作既可以从队头,也可以从队尾。编程实现这个数据结构。 时间限制:1000 内存限制:65535输入 第一行输入一个整数t,代表测试数据的组数。 每组数据的…...
SpringBoot 源码解析
前言 本文只是纯源码分析文章,阅读者需要有Spring或者SpringBoot使用经验。 SpringBoot 源码解析 SpringBoot 源码解析1:环境搭建 SpringBoot 源码解析2:启动流程1 SpringBoot 源码解析3:启动流程2 SpringBoot 源码解析4&#…...
dockerfile---创建镜像
dockerfile创建镜像:创建自定义镜像。 包扩配置文件的创建,挂载点,对外暴露的端口。设置环境变量。 docker镜像的方式: 1、基于官方源进行创建 根据官方提供的镜像源,创建镜像,然后拉起容器。是一个白板,…...
Raspberry PI + Codesys + EtherCAT步进驱动ECR60 Motion功能测试
原文连接:Raspberry PI Codesys EtherCAT步进驱动ECR60 Motion功能测试 – 个人资料收集 (rtplc.com) <div class"post_info_wrapper "> <p class"has-drop-cap">运动控制功能是codesys及EtherCAT通讯的重要功能&am…...
终极指南:10个必学Objective-C库助力iOS开发效率翻倍
终极指南:10个必学Objective-C库助力iOS开发效率翻倍 【免费下载链接】TimLiu-iOS iOS开发常用三方库、插件、知名博客等等 项目地址: https://gitcode.com/gh_mirrors/ti/TimLiu-iOS TimLiu-iOS是一个精心整理的iOS开发资源宝库,包含了Objective…...
开源首发:DocCenter — AI 时代的 HTML工作台深度解析
Tags:Python aiohttp 开源项目 AI工具 前端工程 工具分享 Claude ChatGPT 专栏:「工具开源」/「DocCenter」 一、痛点:AI 时代的文档散落病 过去一年,我每天被 AI 生成的 HTML 文件淹没。 Claude artifacts 一天 20 个、ChatGPT…...
嵌入式FPGA如何重塑MCU设计:从可编程I/O到硬件加速的范式变革
1. 微控制器的十字路口:成本困境与集成机遇作为一名在嵌入式领域摸爬滚打了十几年的工程师,我亲眼见证了微控制器(MCU)从简单的8位机发展到如今动辄数百兆赫兹主频、集成度惊人的复杂系统。但这些年,一个核心矛盾越来越…...
对话记忆与上下文管理:Spring AI 实现多轮会话与持久化存储
系列导读 你现在看到的是《Spring AI 企业级集成与场景实践:从零搭建智能应用》的第 3/10 篇,当前这篇会重点解决:教会读者如何在 Spring AI 中优雅地管理对话上下文,避免重复输入和 Token 浪费。 上一篇回顾:第 2 篇《多模型适配实战:在 Spring AI 中统一管理 OpenAI、…...
新手避坑指南:Unity工程里这6个文件夹,一个都别乱动(含ProjectSettings详解)
Unity工程目录安全手册:新手必须掌握的6个核心文件夹管理法则 刚接触Unity开发时,面对工程目录里那些神秘的文件夹,你是否曾犹豫过"这个能删吗?那个能改吗?"——我完全理解这种困惑。三年前接手第一个商业项…...
Python开发者三步完成Taotoken大模型API的首次调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Python开发者三步完成Taotoken大模型API的首次调用 对于希望快速体验不同大模型能力的Python开发者而言,通过一个统一的…...
OpenArk:Windows系统安全检测的终极完整解决方案指南 [特殊字符]️
OpenArk:Windows系统安全检测的终极完整解决方案指南 🛡️ 【免费下载链接】OpenArk The Next Generation of Anti-Rookit(ARK) tool for Windows. 项目地址: https://gitcode.com/GitHub_Trending/op/OpenArk OpenArk是一款强大的Windows开源反R…...
鸿蒙动画开发全指南:属性动画+显式动画+转场动画+路径动画,一文掌握所有动画类型
📖 鸿蒙NEXT开发实战系列 | 第32篇 | 实战篇 🎯 适合人群:有ArkUI基础的开发者 ⏰ 阅读时间:约15分钟 | 💻 开发环境:DevEco Studio 5.0 导航链接 上一篇:鸿蒙NEXT开发实战系列31-通知与提醒管理…...
Node.js 服务端项目如何集成 Taotoken 实现稳定大模型调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Node.js 服务端项目如何集成 Taotoken 实现稳定大模型调用 在构建现代服务端应用时,集成大模型能力已成为提升产品智能…...
压电定位平台建模与运动控制【附仿真】
✨ 长期致力于压电定位平台、磁滞非线性、反步控制、滑模控制、有限时间控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)Prandtl-Ishlinskii磁滞模…...
