- 属于创建型设计模式
- 优点:确保所有的对象都访问一个实例,避免对共享资源的多重占用
- 缺点:不适用于变化的对象,扩展困难
- 单例模式应用在 Spring Bean 的创建中
构造单例最简单的方法,就是使用枚举
使用枚举可以保证线程安全
// 枚举
public enum ZooEnum {
Instance;
@Override
public String toString() {
return getDeclaringClass().getCanonicalName() + "@" + hashCode();
}
}// 线程安全,懒加载
public class ZooDoubleCheck {
private static volatile ZooDoubleCheck instance;
private ZooDoubleCheck() {
// 防止通过反射调用实例化
if (instance != null) {
throw new IllegalStateException("Already initialized.");
}
}
public static ZooDoubleCheck getInstance() {
// 使用局部变量会加快速度
ZooDoubleCheck check = instance;
if (check == null) {
synchronized (ZooDoubleCheck.class) {
// 更新局部变量
check = instance;
if (check == null) {
// 双重检测都为null时进行实例化
instance = check = new ZooDoubleCheck();
}
}
}
return check;
}
}线程安全,懒加载
public class ZooInner {
// 私有构造方法
private ZooInner() {
}
public static ZooInner getInstance() {
return Holder.INSTANCE;
}
private static class Holder {
private static final ZooInner INSTANCE = new ZooInner();
}
}