当前位置: 首页 > news >正文

92、23种设计模式-单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,其核心目标是确保一个类在任何情况下都只有一个实例对象,并提供全局访问点以共享该实例。以下是单例模式的详细解析:

一、核心特点

  • 唯一实例:类自身负责创建并维护唯一实例,禁止外部通过构造函数直接实例化。
  • 全局访问:通过静态方法(如getInstance())提供对唯一实例的访问。
  • 延迟初始化(可选):实例可在首次使用时创建(懒汉式),或在类加载时创建(饿汉式)。

二、实现方式对比

单例模式有多种实现方式,各有优缺点,需根据场景选择:

实现方式代码示例优点
饿汉式(静态常量)public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } }线程安全(类加载时初始化)、实现简单。
懒汉式(线程不安全)public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }延迟加载,节省内存。
懒汉式(同步方法)public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }线程安全。
双重检查锁定(DCL)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; } }线程安全、延迟加载、高效(仅首次同步)。
静态内部类public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }线程安全(类加载机制保证)、延迟加载、无锁高效。
枚举实现public enum Singleton { INSTANCE; public void doSomething() {} }线程安全、防止反射攻击、自动支持序列化、实现简单。

三、推荐实现方式

1.枚举实现

  • 最佳选择:Java中枚举天然支持单例,可防止反射攻击和序列化问题,代码简洁。
  • 适用场景:无需延迟初始化,且希望代码健壮性高的场景。

2.静态内部类

  • 平衡之选:结合了线程安全、延迟加载和高效性,是懒汉式的优化实现。
  • 适用场景:需要延迟初始化且追求性能的场景。

3.双重检查锁定(DCL)

  • 高性能需求:在需要延迟加载且对性能敏感的场景下使用,但需注意volatile关键字的使用。

四、应用场景

  • 资源管理:如数据库连接池、线程池、文件系统等,需避免重复创建和销毁资源。
  • 配置管理:全局配置对象需唯一,确保配置一致性。
  • 日志记录:单例日志器可集中管理日志输出,避免多实例混乱。
  • 硬件控制:如打印机管理器、传感器控制器等,需单一控制逻辑。

五、注意事项

  • 线程安全:多线程环境下需确保单例的唯一性(推荐使用枚举、静态内部类或DCL)。
  • 反射攻击:通过反射可破坏单例(枚举实现可避免此问题)。
  • 序列化问题:单例类实现Serializable接口时,需重写readResolve()方法防止反序列化创建新实例。
  • 分布式系统:单例模式仅保证单个JVM内的唯一性,分布式环境下需结合其他机制(如分布式锁)。

总结

单例模式通过控制实例的创建和访问,有效降低了系统开销,确保了资源的高效利用。在实际开发中,应根据具体需求(如线程安全、延迟加载、性能等)选择合适的实现方式。枚举实现因其简洁性和健壮性,通常是Java中的首选方案;若需延迟加载,静态内部类是更灵活的选择。

在这里插入图片描述

http://www.xdnf.cn/news/1296991.html

相关文章:

  • 【软考架构】信息安全基础知识
  • 考研408《计算机组成原理》复习笔记,第五章(1)——CPU功能和结构
  • 云原生存储架构设计与性能优化
  • 【深度学习计算性能】04:硬件
  • CTFSHOW | nodejs题解 web334 - web344
  • 主进程如何将客户端连接分配到房间进程
  • 数巅中标中建科技AI知识库项目,开启建筑业数智化新篇章
  • 项目日志框架与jar中日志框架冲突 解决
  • MFC的使用——使用ChartCtrl绘制曲线
  • DataHub IoT Gateway:工业现场设备与云端平台安全互联的高效解决方案
  • 使用HalconDotNet实现异步多相机采集与实时处理
  • 零信任架构(Zero Trust Architecture, ZTA)(通过动态验证和最小权限控制,实现对所有访问请求的严格授权和持续监控)
  • Kafka消费者组
  • OpenCV阈值处理详解
  • Docker pull拉取镜像命令的入门教程
  • K8s学习----Namespace:资源隔离与环境管理的核心机制
  • Rabbitmq+STS+discovery_k8s +localpv部署排坑详解
  • 希尔排序专栏
  • C++ 仿RabbitMQ实现消息队列项目
  • Trae x Figma MCP一键将设计稿转化为精美网页
  • 通信算法之313:FPGA中实现滑动相关消耗DSP资源及7045/7035的乘法器资源
  • Mysql基本使用语句(一)
  • 读《精益数据分析》:移情(Empathy)—— 验证真实需求,避免伪需求陷阱
  • OpenLayers与Vue.js结合实现前端地图应用
  • 51单片机-驱动LED模块教程
  • 机器视觉之图像处理篇
  • 相较于传统AR作战环境虚拟仿真系统,其优势体现在哪些方面?
  • Flutter 顶部导航标签组件Tab + TabBar + TabController
  • 读From GPT-2 to gpt-oss: Analyzing the Architectural Advances
  • 线上故障定位:从报警到根因的实战指南