Java 设计模式 01:单例模式
单例模式
单例模式的定义顾名思义就是一个类只有一个实例,形象地说例如 Windows 系统我的电脑属性界面,就是一个单例模式的例子,当已经有一个打开的我的电脑属性界面,我们无法再打开一个新的相同的界面
单例模式有以下特点:
- 单例类只有一个实例对象
- 这个对象只能由单例类自行创建
- 单例类对外提供一个可以访问单例实例的全局访问点
单例模式的设计
通常情况下,我们设计的类的构造函数都是共有的(public),我们可以在程序中通过new 构造函数()
的方式按需创建多个实例,要实现单例模式的要求,我们就要将构造函数设置为私有的(private),这时程序无法直接通过new
创建对象,就需要单例类为其提供一个生成实例的全局接口
懒汉式
懒汉式不会在程序运行时自动创建实例,而是在程序中调用单例类提供的接口时再创建,这样就需要在单例类中做一定的限制:
// 懒汉式单例模式
public class LazySingleton {
private static volatile LazySingleton instance = null;
private LazySingleton() {
// private 避免类在外部被实例化
}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
饿汉式
饿汉式会在单例类初始化时就创建单例实例,因为单例类的初始化只有一次,所以单例实例也一定只有一个:
// 饿汉式单例模式
public class HungrySingleton {
private static final HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
}
单例模式的优缺点
优点
- 确保所有对象都访问同一个实例
- 实现了对唯一实例的受控访问
- 只存在一个实例,节约系统资源,避免共享资源的多重占用
缺点
- 不适用变化的对象
- 单例模式没有抽象层,扩展上有难度
- 单例类职责过重,一定程度上违背了“单一职责原则”