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

一、创建型(单例模式)

单例模式

概念
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。它控制类的实例化过程,防止外部代码创建新的实例。


应用场景

  1. 日志记录:确保只有一个日志记录器,以便于管理和避免重复记录。
  2. 配置管理:用于读取和存储配置信息,确保全局只有一个配置对象。
  3. 线程池:管理线程池,确保其只有一个实例,便于资源管理。
  4. 数据库连接:通过单例模式管理数据库连接,避免频繁创建和销毁连接。
  5. 缓存管理:使用单例管理缓存,以确保数据一致性和减少内存使用。
  6. UI管理:在图形用户界面中,某些组件如主窗口可能需要确保只有一个实例。

注意点

  • 线程安全:如果在多线程环境中使用,需要确保线程安全,避免出现多个实例。
  • 序列化问题:反序列化时,可能会创建新的实例,需实现 readResolve 方法防止此问题。
  • 懒加载:如果实例的创建开销较大,可以使用懒加载方式,但需处理好同步问题。

核心要素

  1. 私有构造函数:防止外部实例化。
  2. 静态变量:持有唯一实例。
  3. 静态方法:提供访问实例的全局方法。
  4. 线程安全:确保在多线程环境下安全使用。

Java代码示例

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. 饿汉式
    在类加载时就创建实例,适合实例化开销不大且始终需要使用的场景。

    public class EagerSingleton {private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {}public static EagerSingleton getInstance() {return instance;}
    }
    
  2. 静态内部类
    利用静态内部类实现懒加载,同时线程安全。

    public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {}private static class Holder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return Holder.INSTANCE;}
    }
    
  3. 枚举方式
    Java中推荐的单例实现方式,天然支持序列化。

    public enum EnumSingleton {INSTANCE;// 其他方法
    }
    
  4. 双重检查锁定
    提高性能,减少同步开销。

    public class DoubleCheckedLockingSingleton {private static volatile DoubleCheckedLockingSingleton instance;private DoubleCheckedLockingSingleton() {}public static DoubleCheckedLockingSingleton getInstance() {if (instance == null) {synchronized (DoubleCheckedLockingSingleton.class) {if (instance == null) {instance = new DoubleCheckedLockingSingleton();}}}return instance;}
    }
    

这些是单例模式的基本知识和变形用法

http://www.lryc.cn/news/456706.html

相关文章:

  • 毕业设计项目-古典舞在线交流平台的设计与实现(源码/论文)
  • 【秋招笔试】10.09华子秋招(已改编)-三语言题解
  • 【算法笔记】双指针算法深度剖析
  • 第二十二天|回溯算法| 理论基础,77. 组合(剪枝),216. 组合总和III,17. 电话号码的字母组合
  • 关闭IDM自动更新
  • Go 性能剖析工具 pprof 与 Graphviz 教程
  • 【题目解析】蓝桥杯23国赛C++中高级组 - 斗鱼养殖场
  • JavaScript可视化:探索顶尖的图表库
  • 谷歌AI大模型Gemini API快速入门及LangChain调用视频教程
  • 进入容器:掌控Docker的世界
  • 初始Linux(二)基础命令
  • STM32 OLED
  • 伦敦金实时行情决策辅助!
  • ​Leetcode 746. 使用最小花费爬楼梯​ 入门dp C++实现
  • 路由协议常见知识点
  • 多模态大语言模型(MLLM)-InstructBlip深度解读
  • 网页前端开发之Javascript入门篇(7/9):字符串
  • 双登股份再战IPO:数据打架,实控人杨善基千万元股权激励儿子
  • 4.Python 函数(函数的定义、函数的传入参数、函数的返回值、None 类型、函数说明文档、变量的作用域)
  • 【JavaEE】——文件IO
  • Python的pandas库基本操作(数据分析)
  • 软件测试(平铺版本)
  • 树控件QTreeWidget
  • Python酷库之旅-第三方库Pandas(139)
  • 昇思学习打卡营学习记录:CycleGAN壁画修复
  • 南京大学《软件分析》李越, 谭添——1. 导论
  • 使用seata管理分布式事务
  • 浏览器指纹
  • W外链平台有什么优势?
  • 深入理解Spring Cache:加速应用性能的秘钥