Java 设计模式:单例模式的演变——从饱汉到饿汉
2023-12-02 14:36:58
饱汉模式与饿汉模式:单例设计模式的两种实现
在软件设计中,单例设计模式是一种创建只有一份实例的类的模式。单例模式有多种实现方式,其中饱汉模式和饿汉模式是最常用的两种。
饱汉模式
顾名思义,饱汉模式只会在需要的时候才创建单例实例。就像一个吃饱了的人不会急着再吃东西,饱汉模式也不会在类加载时就初始化单例,而是在第一次使用时才创建。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在上面的例子中,Singleton
类的单例实例instance
在类加载时被初始化为null
。当第一次调用getInstance()
方法时,它会检查instance
是否为null
。如果是,则会创建一个新的Singleton
实例并将其赋值给instance
,然后返回instance
。
饿汉模式
饿汉模式与饱汉模式相反,它在类加载时就创建单例实例。就像一个饥饿的人会迫不及待地去寻找食物,饿汉模式会在类加载时就创建一个单例实例,并将其存储起来,以便以后使用。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
在上面的例子中,Singleton
类的单例实例instance
在类加载时就被初始化为一个新的Singleton
实例。因此,在第一次调用getInstance()
方法时,不需要进行任何检查,可以直接返回instance
。
两种模式的优缺点
饱汉模式
- 优点: 只在需要的时候创建实例,不会浪费资源。
- 缺点: 需要进行线程安全检查,以确保单例只被初始化一次。
饿汉模式
- 优点: 实现简单,线程安全。
- 缺点: 浪费资源,即使单例实例可能永远不会被使用,也会占用内存空间。
什么时候使用哪种模式
一般来说,如果单例实例可能不会被经常使用,那么可以使用饱汉模式。如果单例实例可能被经常使用,并且需要保证线程安全,那么可以使用饿汉模式。
常见问题解答
- 饱汉模式和饿汉模式有什么区别?
饱汉模式只会在需要的时候才创建单例实例,而饿汉模式会在类加载时就创建单例实例。
- 哪种模式更好?
没有一种模式绝对比另一种模式更好,需要根据具体场景选择合适的模式。
- 饱汉模式如何确保线程安全?
饱汉模式需要使用线程安全检查,例如双重检查锁定,以确保单例只被初始化一次。
- 饿汉模式如何避免浪费资源?
如果单例实例不太可能被使用,可以使用延迟加载的饿汉模式变种,例如使用静态内部类或枚举。
- 我应该使用哪种模式来实现单例?
如果单例实例可能不会被经常使用,那么可以使用饱汉模式。如果单例实例可能被经常使用,并且需要保证线程安全,那么可以使用饿汉模式。