设计模式-单例模式总结

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。
  • 总之,单例模式是一种有用的设计模式,可以帮助我们在需要时创建一个唯一的对象实例。然而,它也有一定的局限性和注意事项,需要根据具体场景和需求来选择适合的实现方式。
相关推荐
matrixlzp4 小时前
Java 责任链模式 减少 if else 实战案例
java·设计模式
编程、小哥哥6 小时前
设计模式之组合模式(营销差异化人群发券,决策树引擎搭建场景)
决策树·设计模式·组合模式
hxj..8 小时前
【设计模式】外观模式
java·设计模式·外观模式
吾与谁归in8 小时前
【C#设计模式(10)——装饰器模式(Decorator Pattern)】
设计模式·c#·装饰器模式
无敌岩雀9 小时前
C++设计模式行为模式———命令模式
c++·设计模式·命令模式
马剑威(威哥爱编程)17 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
gjh120817 小时前
单例模式和适配器模式的简单介绍
单例模式·适配器模式
In_life 在生活19 小时前
设计模式(四)装饰器模式与命令模式
设计模式
瞎姬霸爱.19 小时前
设计模式-七个基本原则之一-接口隔离原则 + SpringBoot案例
设计模式·接口隔离原则
鬣主任20 小时前
Spring设计模式
java·spring boot·设计模式