白话-23种设计模式4-单例模式

举报
object 发表于 2022/06/28 17:34:42 2022/06/28
【摘要】 一、白话  单例模式是被知晓最多的模式,无外乎简单。理解也是一样,无外乎就是生成一个独一无二的东西,不管谁来,什么时候来,只能拿到同一个东西。例如银行账号,不管你取了几次钱,什么时候去取,始终都是那个账号,不会说你往这个账号存了两次钱,下一次去取,你是从其他账号取出来的。身份证这些也是一样的,不管你有多少张身份证,都是绑定你这个人,你这个人是独一无二的,无论何时何地,你都只有一个,所以绑定身...

一、白话

  单例模式是被知晓最多的模式,无外乎简单。理解也是一样,无外乎就是生成一独一无二的东西,不管谁来,什么时候来,只能拿到同一个东西。例如银行账号,不管你取了几次钱,什么时候去取,始终都是那个账号,不会说你往这个账号存了两次钱,下一次去取,你是从其他账号取出来的。身份证这些也是一样的,不管你有多少张身份证,都是绑定你这个人,你这个人是独一无二的,无论何时何地,你都只有一个,所以绑定身份证,数据户口里面只有一个你,不管你是在哪个派出所办理的绑定。

二、定义

  单例模式基本定义:程序运行时,在java虚拟机中只存在该类的一个实例对象。

  懒汉模式、饿汉模式:区别无外乎是否初始化。

  饿汉模式:进行初始化、安全。但是浪费内存

  懒汉模式:不进行初始化、不安全。因为不安全,所以需要额外进行管控,目前最安全的设计莫过于volatile + 双重锁判定

三、示例

  

/**
 * 饿汉模式
 */
public class Hungry {
    // 程序启动即加载,static全局通用
    private static Hungry hungry = new Hungry();

    private Hungry() { // 隐藏构造函数,禁止再次改造
    }

    // 统一对外接口
    public static Hungry getInstance() {
        return hungry;
    }
}
/**
 * 懒汉模式
 */
public class Lazy {
    // 不初始化,volatile保证变量的可见性,防止操作指令重排序
    private static volatile Lazy lazy;

    private Lazy(){ // 隐藏构造器,防止多次构造
    }

    public static Lazy getInstance() {
        if (lazy == null) { // 双重判断 + 锁
            synchronized (Lazy.class) {
                lazy = new Lazy();
            }
        }
        return lazy;
    }
}
public class SingletonApplication {

    public static void main(String[] args) {
        Hungry hungry1 = Hungry.getInstance();
        Hungry hungry2 = Hungry.getInstance();
        System.out.println("Hungry 是否相等" + (hungry1 == hungry2));
        Lazy lazy1 = Lazy.getInstance();
        Lazy lazy2 = Lazy.getInstance();
        System.out.println("Lazy 是否相等" + (lazy1 == lazy2));
    }

}

输出结果:

四、总结

  优点:可以确保所有对象访问唯一示例。一个实例减少性能开销,只需要唯一对象的特殊场景支持。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。