设计模式之单例模式
单例模式
定义私有的构造方法,初始化静态实例对象。只容许getInstance.
饿汉模式
/**
* @author 玛瑙小龙虾
* @date 2022/7/11
* 饿汉模式,启动就实例化。
*/
public class HungrySingle {
private static final HungrySingle HUNGRY_SINGLE = new HungrySingle();
private HungrySingle() {
}
public static HungrySingle getInstance() {
return HUNGRY_SINGLE;
}
public void someCode() {
System.out.println("饿汉模式");
}
}
懒汉模式,(双重加锁)
/**
* @author 玛瑙小龙虾
* @date 2022/7/11
* 双重判断
*/
public class Lazy01Single {
/**
* volatile 防止指令重排
*/
private static volatile Lazy01Single lazy01Single;
private Lazy01Single() {
}
public static synchronized Lazy01Single getInstance() {
if (null == lazy01Single) {
synchronized (Lazy01Single.class) {
if (null == lazy01Single) {
lazy01Single = new Lazy01Single();
}
}
}
return lazy01Single;
}
public void someCode(){
System.out.println("双重检查");
}
}
内部类方式
public class LazySingle {
private LazySingle() {
}
private static class InnerHolder {
private static final LazySingle LAZY_SINGLE = new LazySingle();
}
/**
* 获取实例对象
*
* @return LazySingle
*/
public static LazySingle getInstance() {
return InnerHolder.LAZY_SINGLE;
}
public void someCode() {
System.out.println("内部类模式");
}
}
枚举单例
/**
* @author 玛瑙小龙虾
* @date 2022/7/11
*/
public enum EnumSingle {
/**
* 实例对象
*/
INSTANCE;
public void someCode(){
System.out.println("枚举单例");
}
}
调用结果
/**
* @author 玛瑙小龙虾
* @date 2022/7/11
*/
public class SingleMain {
public static void main(String[] args) {
HungrySingle.getInstance().someCode();
System.out.println(HungrySingle.getInstance().hashCode() + " ==== " + HungrySingle.getInstance().hashCode());
EnumSingle.INSTANCE.someCode();
System.out.println(EnumSingle.INSTANCE.hashCode() + " ==== " + EnumSingle.INSTANCE.hashCode());
LazySingle.getInstance().someCode();
System.out.println(LazySingle.getInstance().hashCode() + " ==== " + LazySingle.getInstance().hashCode());
Lazy01Single.getInstance().someCode();
System.out.println(Lazy01Single.getInstance().hashCode() + " === " + Lazy01Single.getInstance().hashCode());
}
推荐使用枚举单例,可防止反序列化