设计模式-单例模式总结

1. 概念

  • 保证一个类只有一个实例
  • 并为该实例提供一个全局唯一的访问节点

2. 使用场景

  • 需要频繁进行创建和销毁的对象,如线程池、缓存等。
  • 需要在整个系统中保持状态一致的对象,如配置管理器、连接池等。
  • 需要确保多个对象共享相同状态的场景,如日志记录器、驱动程序对象等。

3. 优点

  • 节省资源,避免重复创建对象。
  • 提供单一控制点,方便管理和维护。
  • 确保全局唯一性,避免多实例带来的问题。

4. 缺点

  • 增加系统复杂度,需要考虑多线程环境下的同步问题。
  • 滥用单例模式可能导致代码难以测试和理解。
  • 违反单一职责原则,可能导致职责不清晰。

5. 实现方式

  • 饿汉式:在类加载时就完成了实例化,避免了多线程同步问题,但可能导致资源浪费。
  • 懒汉式:在第一次使用时才创建实例,节省了资源,但需要考虑多线程环境下的同步问题。
  • 双重检查锁定:结合了饿汉式和懒汉式的优点,既保证了线程安全,又避免了资源浪费。
  • 静态内部类:利用了类加载机制来保证实例的唯一性和懒加载特性。
  • 枚举:通过枚举类型来实现单例,简洁且自动支持序列化机制。

6. 适用性

  • 单例模式适用于那些需要全局唯一实例的场景,特别是那些涉及到资源共享、状态管理等情况。然而,过度使用单例模式可能导致代码耦合度高、可测试性差等问题,因此需要谨慎使用。

7. JDK中使用

  1. Runtime类:Runtime 类封装了 Java 运行时的环境。每个 Java 应用程序在启动时都会创建一个 JVM 进程,而Runtime 类为这个进程提供了与其运行时环境相关的操作和信息。由于每个 JVM 进程只需要一个 Runtime 实例,因此它采用了单例模式来确保全局只有一个实例。
  2. java.util.Locale 和 java.lang.SecurityManager 等。这些类通常涉及到全局状态或者资源的管理,需要保证在整个 JVM 中只有一个实例。
  3. 系统属性和环境变量:系统属性和环境变量在 JVM 中也是以单例的形式存在的,它们在程序运行期间提供了一系列不可变的键值对,用于存储配置信息。
  4. 日志工具类:日志工具类(如 java.util.logging.Logger)也使用了单例模式,确保每个日志消费者只创建一个日志记录器实例。
  5. 驱动程序对象:在数据库连接中,驱动程序对象通常也是单例的,因为它们负责管理与数据库的连接,不需要多个实例来处理。
  6. 缓存池:在 Java 中,缓存池(如连接池、对象池等)也常常使用单例模式来实现,以保证全局只有一个缓存池实例,从而节省资源和提高效率。
  7. 配置管理器:配置管理器通常也会设计成单例模式,以确保应用程序中的配置信息是一致的。
  8. 工具类:一些工具类,如日期格式化工具、加密解密工具等,由于它们的无状态性,也适合设计成单例模式。
  9. 应用服务器:在应用服务器中,单例模式常用于管理服务器资源,如会话管理、事务管理等。

8. 注意事项及细节说明

  • 注意事项
    • 在多线程环境下,需要注意同步问题,确保线程安全。
    • 考虑序列化和反序列化对单例的影响,避免产生多个实例。
    • 注意单例对象的释放时机,避免资源泄漏。
  • 细节说明
    • 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
    • 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new。
  • 总之,单例模式是一种有用的设计模式,可以帮助我们在需要时创建一个唯一的对象实例。然而,它也有一定的局限性和注意事项,需要根据具体场景和需求来选择适合的实现方式。
相关推荐
J_liaty17 小时前
23种设计模式一代理模式
设计模式·代理模式
苏渡苇1 天前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日1 天前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.1 天前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon1 天前
七大设计原则介绍
设计模式
云姜.1 天前
单例模式及线程安全问题
单例模式
YigAin1 天前
Unity23种设计模式之 享元模式
设计模式·享元模式
范纹杉想快点毕业2 天前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑2 天前
DDD领域驱动设计-基础设施层
设计模式·架构
木井巳2 天前
【多线程】单例模式
java·单例模式·java-ee