当前位置: 首页 > 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.lryc.cn/news/620928.html

相关文章:

  • LeetCode 面试经典 150_数组/字符串_最后一个单词的长度(19_58_C++_简单)(反向遍历)
  • vector 认识及使用
  • MTK平台Wi-Fi学习--如何修改wifi 的TX Power
  • 计算机毕设大数据选题推荐 基于spark+Hadoop+python的贵州茅台股票数据分析系统【源码+文档+调试】
  • STL——容器——容器适配器
  • Mac chrome浏览器下载DevEco Studio 6.0.0 Beta2失败
  • MacOS 系统计算机专业好用工具安装
  • Spring Boot 深度解析:从原理到实践
  • 亚马逊手工制品分类体系革新:从流量重构到运营升级的深度解析
  • [已解决]当启动 Spring Boot 应用时出现 Using generated security password xxx提示
  • Rust Web框架Axum学习指南之入门初体验
  • vue部署正式环境上传nginx后遇到的问题
  • MySQL中的DML(二)
  • mysql查询中的filesort是指什么
  • 第三方软件检测:软件性能测试报告(一)
  • CMake笔记:Alias Target在哪些地方可以使用
  • 使用Docker安装MeiliSearch搜索引擎
  • 【完整源码+数据集+部署教程】柠檬质量检测系统源码和数据集:改进yolo11-DBBNCSPELAN
  • nginx入门需知(含安装教程)
  • 知识的本质
  • 【MATLAB技巧】已知平面上的一些点,拟合得到一个圆的例程,给出最小二乘与非线性迭代两种解法,附下载链接
  • Swift 数据类型全景解析(基础到高阶)
  • Gradle(四)Maven 项目迁移 Gradle 项目实践
  • [激光原理与应用-274]:理论 - 波动光学 - 光是电磁波,无线电磁波可以通过天线接收和发送,为什么可见光不可以?
  • 滑动窗口题目:定长子串中元音的最大数目
  • 【读代码】开源流式语音编码器SecoustiCodec
  • MySQL的索引(索引的创建和设计原则):
  • python自学笔记8 二维和三维可视化
  • 业务敏捷性对SAP驱动型企业意味着什么?如何保持企业敏捷性?
  • 网络通信全过程:sk_buff的关键作用