单例模式
什么是单例模式:
在单例模式下,一个类仅允许创建一个对象,单例模式提供了一种控制类示例数目并节约资源的方法。
关键特性:
- 单一实例;
- 全局访问点:单例类会提供一个全局访问该实例的静态方法;
- 自我实例化:单例类负责创建自己的唯一示例,并确保其他实例不被创建;
实现方式:
- 懒汉式:实例在第一次请求时创建,实现简单,但存在线程安全问题;
- 饿汉式:实例在类加载时创建,线程安全,但是会造成资源浪费;
- 双重检查锁:线程安全,节省性能。综合了懒汉式和饿汉式的优点;
- 静态内部类:利用类加载机制保证初始化实例时只有一个,简洁,线程安全;
- 枚举法:简洁,线程安全,支持自动序列化机制,防止反射攻击,实现单例模式的最佳方法;
使用场景:
- 全局共享资源,如配置文件的读取。
- 控制资源的访问,如数据库连接或线程池。
- 用于日志记录、设备驱动对象等。
优点:
- 节省系统资源,减少系统开销。
- 避免对资源的多重占用。
- 提供了全局访问点。
缺点:
- 违反了单一职责原则,单例类除了自身业务外,还要负责自管理。
- 扩展困难,难以继承。
- 在多线程环境下需要小心处理。
示例代码
- 懒汉式:
public class SingletonLazy {
private static SingletonLazy instance;
private SingletonLazy() {}
public static SingletonLazy getInstance() {
if (instance == null) {
instance = new SingletonLazy();
}
return instance;
}
}
- 饿汉式
public class SingletonEager {
private static final SingletonEager instance = new SingletonEager();
private SingletonEager() {}
public static SingletonEager getInstance() {
return instance;
}
}
未完待续