设计模式概述:单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,其目的在于确保一个类只有一个实例,并提供一个全局访问点。单例模式适用于需要控制实例数目的场景,例如:
- 资源管理:数据库连接池、线程池等
- 配置管理:全局配置、应用设置
- 日志记录器:共享一个日志文件或输出流
下面是单例模式的几个关键要素和常见实现方式:
关键要素
- 私有构造函数:防止类在外部被实例化。
- 私有静态变量:用于存储类的唯一实例。
- 公共静态方法:用于提供对实例的全局访问点。
单例模式的常见实现方式
1. 饿汉式(Eager Initialization)
在类加载时就创建实例,简单但可能会造成资源浪费。
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
2. 懒汉式(Lazy Initialization)
在第一次请求实例的时候才创建,能够节省资源。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3. 线程安全的懒汉式
使用同步块确保线程安全,但会降低效率。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
4. 双重校验锁(Double-Checked Locking)
在多线程环境下,更高效的方式。
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
5. 静态内部类
利用类加载机制,实现延迟加载和线程安全。
public class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
6. 枚举(Enum)
实现单例的最佳实践,线程安全且可防止反序列化。
public enum Singleton {
INSTANCE;
// 可以添加其他方法
public void someMethod() {
// 实现方法
}
}
总结
单例模式简单而常用,但在多线程环境下需要注意线程安全的问题。选择具体实现方式时,需要综合考虑系统需求、开发成本和运行效率。枚举单例是推荐的实现方式,因其天然的线程安全和简单性。