Java单例模式详解:懒汉式、饿汉式与登记式

需积分: 0 4 下载量 149 浏览量 更新于2024-07-29 收藏 88KB DOC 举报
Java单例模式是一种常见的软件设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。在《Java与模式》这本书中,作者阎宏博士详细介绍了三种不同的实现方式:懒汉式、饿汉式和登记式。 1. 懒汉式单例(也称为延迟初始化) - 这种模式在类加载时并不立即创建实例,而是当第一次请求时才创建。如`LazySingleton`类所示,它通过`private static LazySingleton m_instance = null;`来存储实例,`getInstance()`方法使用`synchronized`关键字确保线程安全,只有在实例尚未初始化时才会创建。这种实现方式在Java中易于实现,但若在多线程环境下,可能会消耗较多性能,因为每个线程都需要检查实例是否已存在。 2. 饿汉式单例 - 与懒汉式相反,饿汉式单例在类加载时就创建了单例实例。这种方式确保了在程序运行期间始终有一个可用的实例,避免了线程同步带来的性能开销。但是,如果应用程序一开始不需要使用该类,这部分内存就会浪费。 3. 登记式单例(也称为依赖注入或构造函数注入单例) - 这种实现方式较少见,它依赖于容器或依赖注入框架,通过构造函数传递唯一实例,而不是在类内部管理。这种方式更加灵活,可以与面向切面编程(AOP)或IoC/DI容器配合,但Java标准库本身不支持这种模式。 单例模式的核心特点是: - 确保唯一性:确保一个类在整个程序执行期间只有一个实例。 - 控制实例创建:由单例类自身负责创建实例,并控制何时创建。 - 提供全局访问点:所有其他对象通过类提供的公共方法访问单例实例,而非直接实例化。 总结来说,选择哪种单例模式取决于应用场景的需求和性能考虑。懒汉式适用于对初始延迟不敏感,而饿汉式则适合需要早期初始化的情况。同时,现代开发趋势倾向于使用依赖注入来管理单例,以提高代码的可测试性和灵活性。理解这些模式有助于开发者更好地组织和设计高质量的Java应用程序。