本文主要介绍了单态模式在Java中的两种实现方式——饿汉式单例和懒汉式单例。单态模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点,常用于资源管理,如数据库连接或系统配置等场景。
首先,让我们理解单态模式的核心特性:
1. **唯一实例**:单态类确保在整个应用生命周期中,无论何时请求,都返回同一个预置的对象实例。
2. **自我创建**:单态类负责创建自身的唯一实例,而不是外部代码创建。
3. **共享资源**:单态类通常用于管理共享资源,确保它们在所有依赖者之间被正确地使用和释放。
**饿汉式单例(Eager Singleton)**:
这是一种在类加载时就实例化的单例模式实现。代码中,构造函数被声明为私有,防止其他类直接实例化,通过`getInstance()`静态方法获取。由于类在加载时就实例化了,这种模式对资源的初始化较早,但可能导致早期内存消耗较大,不适用于资源占用较大的情况。
```java
public class EagerSingleton {
private EagerSingleton() {}
private static final EagerSingleton m_instance = new EagerSingleton();
public static EagerSingleton getInstance() {
return m_instance;
}
}
```
**懒汉式单例(Lazy Singleton)**:
与饿汉式不同,懒汉式单例在实际使用时才进行实例化。为了防止多线程同时实例化导致的问题,这里使用了`synchronized`关键字保证线程安全。这种方式延迟了资源的初始化,节省了内存,但可能会出现短暂的性能损失,尤其是在高并发环境中。
```java
public class LazySingleton {
private LazySingleton() {}
private static LazySingleton m_instance = null;
synchronized public static LazySingleton getInstance() {
if (m_instance == null) {
m_instance = new LazySingleton();
}
return m_instance;
}
}
```
比较两者:
- **资源效率**:饿汉式更早地占有资源,但可能造成内存浪费;懒汉式则更节省内存,但初始加载时可能会稍慢。
- **性能**:饿汉式由于实例化在加载时完成,对瞬时性能有利;懒汉式在多线程环境下需处理同步,可能影响响应速度。
- **适用性**:根据应用场景选择,如果内存资源有限或者关注性能优化,懒汉式更为合适;如果希望避免初始化时的不确定性,饿汉式更稳妥。
**举例**:Java中的`java.awt.Toolkit`就是一个典型的单态类实例,因为它在整个应用程序中只有一个工具包实例,无论何时请求,都会返回相同的对象,方便管理和共享底层资源。
总结来说,单态模式是软件设计中的一个重要概念,理解和掌握不同的实现方式(如饿汉式和懒汉式)可以帮助开发者在实际项目中选择最合适的策略,以达到最优的资源管理和性能表现。