设计模式——单例模式
单例模式
1. 饿汉式
- 饿汉式在类加载时就初始化完成创建一个对象供外部使用,该方法线程安全,但无法防止反射创建新对象
public class SingleHungry {
private static SingleObject obj = new SingleObject();
private SingleHungry() {
}
public static SingleObject getInstance() {
return obj;
}
}
2. 懒汉式
- 采用了延迟加载方式避免了空间的浪费,该方法需要加锁来保证线程安全,该方式同样无法防止其他人用反射创建对象
public class SingleLazy {
//延迟加载
private static SingleObject obj = null;
private SingleLazy() {
}
public static SingleObject getInstance() {
if(obj == null) {
synchronized (SingleLazy.class) {
if(obj == null) {
obj = new SingleObject();
}
}
}
return obj;
}
}
3. 静态内部类
- 该方法既保证线程安全也确保只有一个对象创建, 仍然无法避免通过反射创建对象
public class SingleInner {
private static class InnerClass {
private static SingleObject obj = new SingleObject();
}
private SingleInner() {
}
private static SingleObject getInstance() {
return InnerClass.obj;
}
}
4. 枚举
- 保证了线程安全且只创建一个对象,避免了被反射攻击
public class SingleEnum {
//创建内部枚举类
private enum EnumSingle {
SINGLETON;
private SingleObject single;
private EnumSingle() {
single = new SingleObject();
}
public SingleObject getInstance() {
return single;
}
}
public static SingleObject getInstance() {
return EnumSingle.SINGLETON.getInstance();
}
}