设计模式之单例模式

设计模式之单例模式

单例模式

定义私有的构造方法,初始化静态实例对象。只容许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());
    }

推荐使用枚举单例,可防止反序列化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值