单列设计模式

简介: 单列设计模式

概念:是应用最广泛的设计模式之一,解决的就是在程序运行过程当中一个类最多只能创建一个对象的问题,保证一个类只有一个实例

避免对象不一致的状态

引入问题:例如一家公司只有一个打印机,但是有多个部门,A部门想使用打印机就创建A部门对象,B部门使用打印机就会创建B部门对象

通过单例模式构造唯一实例:懒汉式、饿汉式、静态内部类

步骤1:创建一个静态类成员

步骤2:构造方法私有化

步骤3:提供一个公共的创建实例方法

实现:构造函数私有化(单例类不能再其他类中实例化,只能被自身实例化)

拥有一个保存类的实例的静态成员变量

通过一个公共的静态方法返回单例类对象唯一实例


饿汉式:立即加载+线程安全

特点:提前进行实例化,立即加载,没有延迟加载,不管有没有被使用都会有一个初始化的实例加载在内存中,jvm保证类在加载过程中static代码块在多线程或者单线程都正确并只执行一次,线程安全,不会出现像懒汉模式中的多线程问题,资源浪费

public class Cz {
    //静态全局变量,内存唯一,创建一个对象出来
    private static Cz cz = new Cz();//饿汉式,创建一个对象
    private Cz(){};//构造方法私有化
    public static Cz getInstance(){ //提供一个公共方法来创建实例,由该类自己创建的实例
        return cz;
    }
    public static void main(String[] args) {
    Cz c1 = Cz.getInstance();  //创建实例
    Cz c2 = Cz.getInstance();
    System.out.println(c1==c2); //true 判断两个实例是否指向同一个对象
}
}


懒汉式:延迟加载,线程不安全

特点:实现了延迟加载,在多线程可能会出现问题不能保证线程安全

public class Cz {
    //静态全局变量,内存唯一,创建一个对象出来
    private static Cz cz = null;//创建一个私有对象
    private Cz(){}//创建私有构造方法
    public static Cz getInstance(){
        if (cz == null){
            cz = new Cz();
        }
        return cz;
    }
    public static void main(String[] args) {
        Cz c1 = Cz.getInstance();
        Cz c2 = Cz.getInstance();
        System.out.println(c1 == c2);
    }
}


静态内部类单例设计模式:延迟加载+线程安全 一般被称之为Holder

特点:用更少的代码达到延迟加载,由于内部类在编译完成之后也是一个单独的class文件,因此在不使用的情况下SingletonHolder类是不会被加载的,同时jvm在加载在过程中static代码块在多线程或单线程下都正确执行,仅执行一次就解决了延迟加载和线程安全

public class Cz {
    //静态方法私有化
    private Cz(){}
    //静态内部类
    private static class SingletonHolder{
        private static Cz cz = new Cz();
    }
    //提供公共方法创建单例对象
    public static Cz getInstance(){
        return SingletonHolder.cz;
    }
    public static void main(String[] args) {
        Cz c1 = Cz.getInstance();
        Cz c2 = Cz.getInstance();
        System.out.println(c1 == c2);
    }
}


相关文章
|
3月前
|
机器学习/深度学习 数据采集 算法
基于mediapipe深度学习的运动人体姿态提取系统python源码
本内容介绍了基于Mediapipe的人体姿态提取算法。包含算法运行效果图、软件版本说明、核心代码及详细理论解析。Mediapipe通过预训练模型检测人体关键点,并利用部分亲和场(PAFs)构建姿态骨架,具有模块化架构,支持高效灵活的数据处理流程。
|
中间件 Shell Go
EngineGroup:让 Flutter 桌面端引擎“飘”起来
EngineGroup:让 Flutter 桌面端引擎“飘”起来
1757 0
EngineGroup:让 Flutter 桌面端引擎“飘”起来
|
存储 人工智能 JavaScript
RISC-V大赛开发套件详解(五):D1哪吒开发板Haas-UI视频播放
RISC-V大赛开发套件详解(五):D1哪吒开发板Haas-UI视频播放
671 1
RISC-V大赛开发套件详解(五):D1哪吒开发板Haas-UI视频播放
|
Linux 数据库 Docker
CentOS 7安装Docker CE镜像报错问题解决
CentOS 7安装Docker CE镜像报错问题: ** 发现 2 个已存在的 RPM 数据库问题, 'yum check' 输出如下: 7:device-mapper-libs-1.02.170-6.el7_9.5.x86_64 是 7:device-mapper-libs-1.02.170-6.el7.x86_64 的副本 7:device-mapper-libs-1.02.170-6.el7_9.5.x86_64 有缺少的需求 device-mapper = ('7', '1.02.170', '6.el7_9.5')
CentOS 7安装Docker CE镜像报错问题解决
|
弹性计算 算法 网络协议
阿里云服务器u1通用算力型CPU性能评测
阿里云服务器u1通用算力型CPU性能评测,CPU采用2.5 GHz主频Intel Xeon Platinum 8163(Skylake)或者8269CY(Cascade Lake)处理器,云服务器u1不适用于游戏和高频交易等对CPU响应时延高度敏感的应用场景
1235 0
阿里云服务器u1通用算力型CPU性能评测
|
机器学习/深度学习 人工智能 编解码
淘宝如何做智能化UI测试?
阿里QA导读:伴随智能UI的发展,淘宝大促会场已支持AI千人千面的解决方案。但智能UI模块样式庞大的数量级面前,传统的手工测试显得十分的力不从心,单纯地堆积人力已然无法解决问题,我们该如何应对新的挑战?让我们来看看淘宝质量团队是如何破解这个难题。
1153 0
淘宝如何做智能化UI测试?
|
计算机视觉
opencv-contrib-Python编译module ‘cv2.cv2‘ has no attribute ‘xfeatures2d‘
opencv-contrib-Python编译module ‘cv2.cv2‘ has no attribute ‘xfeatures2d‘
398 0
|
资源调度 监控 数据可视化
阿里巴巴任务调度SchedulerX支持日志服务
阿里巴巴任务调度SchedulerX2.0的日志服务,可以让业务方不需要修改一行代码,只需要增加一个log4j2/logback的配置,即可将每次任务调度的框架日志和业务日志进行收集,同时提供白屏日志检索功能,可以通过任务调度平台快速定位任务失败的原因。
1425 0
|
人工智能 达摩院 自然语言处理
AI医健中台技术进展及生态发展
本篇内容分享了AI医健中台技术进展及生态发展。
918 0
AI医健中台技术进展及生态发展
|
小程序
elementui plus怎么在级联选中后关闭弹层
相信大家平时在敲代码的时候,经常都会用到 elementui 组件库,那么就有一个问题,elementui plus怎么在级联选中后关闭弹层呢?
1080 0
elementui plus怎么在级联选中后关闭弹层