一、单例模式的核心思想
单例模式(Singleton Pattern)作为创建型设计模式的代表,其核心目标是确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制资源(如数据库连接池、线程池)或共享配置信息的场景中极为重要。
二、实现方式的演进与优化
1. 饿汉式:简单但可能浪费资源
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
2. 懒汉式:延迟加载但需解决线程安全问题
public class LazySingleton {
private static volatile LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
3. 静态内部类:优雅的实现方式
public class InnerClassSingleton {
private InnerClassSingleton() {}
private static class SingletonHolder {
private static final InnerClassSingleton instance = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance() {
return SingletonHolder.instance;
}
}
4. 枚举单例:Effective Java推荐的方式
public enum EnumSingleton {
INSTANCE;
public void doSomething() {
// 业务方法
}
}
三、单例模式的陷阱与突破
反射攻击防护:通过修改构造器防止反射创建新实例
private Singleton() {
if (instance != null) {
throw new IllegalStateException("实例已存在");
}
}
序列化破坏防护:实现readResolve方法防止反序列化创建新实例
private Object readResolve() {
return getInstance();
}
四、应用场景与最佳实践
单例模式适用于需要频繁创建和销毁的对象、创建耗时或耗资源的对象,以及需要严格控制实例数量的场景。在Spring框架中,Bean默认采用单例模式管理,极大地提高了性能。
然而,单例模式也带来了测试困难、隐藏依赖关系等问题。在实际开发中,应权衡利弊,避免滥用。枚举单例因其简洁性、线程安全性和防反射攻击的特性,成为目前最推荐的实现方式。
掌握单例模式的各种实现方式及其优缺点,能够帮助开发者根据具体场景选择最合适的方案,写出更加健壮、高效的代码。
6647

被折叠的 条评论
为什么被折叠?



