首页 > 其他分享 >单例模式

单例模式

时间:2022-10-11 20:48:45浏览次数:33  
标签:Hungry 模式 LazyMan 单例 new 懒汉

单例模式

单例模式是指使用的时候只new一次,即使多次使用这个类,我们只需要new一次就可以,这样就达到了节省空间的效果,

单例模式分为 饿汉式懒汉式这两个模式

单例模式的无参构造的修饰符必须是 私有的

为了防止调用,声明的类变量的修饰符也必须是 私有的

饿汉式单例模式

饿汉式顾名思义,有一中不理性的意思,而在这里的代码,也有同意。

/**
 * @author Mxhlin
 * @Email [email protected]
 * @Date 2022/09/08/20:40
 * @Version
 * @Description   饿汉式单例
 */
public class Hungry {
    // byte[] b1 = new byte[1024*1024];
    // byte[] b2 = new byte[1024*1024];
    // byte[] b3 = new byte[1024*1024];
    
    // 可能会浪费空间
    private Hungry(){

    }
    private final static Hungry HUNGRY = new Hungry();

    public static Hungry getInstance(){
        return HUNGRY;
    }
}

在执行getInstance()的方法时,就会new一个Hungry的对象,这样会导致,如果 这里的类里面有其他的属性或者声明时也会被构建创造,就会导致浪费资源。

懒汉式单例模式

懒汉式单例模式使用了 双重检测锁模式 ,就是满足一定的条件时才new,这样就会节省不必要的浪费资源。

/**
 * @author Mxhlin
 * @Email [email protected]
 * @Date 2022/09/08/20:07
 * @Version
 * @Description 懒汉式模式 DCL懒汉式
 */
public class LazyMan {

    private LazyMan(){
       
    }
    // 在这里加上volatile 防止返回的LazyMan没有完成构造,而返回一个虚无的空间
    private volatile static LazyMan LazyMan;

    // 双重检测锁模式 懒汉式模式 DCL懒汉式
    public static LazyMan getInstance(){
        if (LazyMan == null){
            synchronized (LazyMan.class){
                if (LazyMan==null){
                    LazyMan = new LazyMan();// 不是一个原子行操作
                    /**
                     * 1.分配内存空间
                     * 2.执行这个构造方法
                     * 3.把这个对象指向这个空间
                     */
                }
            }
        }
        return LazyMan;
    }
}

和懒汉式的区别就是,定义一个LazyMan类的属性,在满足一定条件时,new。 这样进入这个代码就不会直接new,而是看一下内存空间有没有已经new过的,如果有的话就不需要再次new了,直接返回LazyMan这个实例

标签:Hungry,模式,LazyMan,单例,new,懒汉
From: https://www.cnblogs.com/xhlin/p/16782477.html

相关文章

  • 4. 设计模式--原型模式
    原型模式在java中我们知道通过new关键字创建的对象是非常繁琐的(类加载判断,内存分配,初始化等),在我们需要大量对象的情况下,原型模式就是我们可以考虑实现的方式。原型......
  • Java设计模式之 装饰模式实验报告书
    Java设计模式之装饰模式实验报告书姓名:班级:学号:实验三:装饰模式的应用一、实验目的熟练使用JAVA实现装饰模式,理解设计模式的模式动机,掌握模式结构,学习如何使用代码实现......
  • 42. JS严格模式(use strict)详解
    1.前言由于JavaScript语法不够严谨,一直被人们所诟病,例如在使用一个变量时,可以不使用var关键字来提前声明(例如:url='http://c.biancheng.net/';),此时JavaScript解释......
  • 设计模式二(建造者模式)
    建造者模式   设计模式的关键步骤是    importjava.util.ArrayList;importjava.util.List;publicclassMeal{privateList<Item>items=......
  • LT模式和ET模式
    LT和ETLT(电平触发)​ 在执行epoll_wait()后,LT会去遍历文件描述符去查询是否有就绪的事件,如果有,就返回,且如果事件没有处理完,还会在下次epoll_wait()时返回(用可读事件理解......
  • mac使用php命令模式非常卡怎么办?
    问题刚换了台老爷机刷上了Mojave,成功吃水果,偷懒用一键环境装了个php7.1,为什么不自己编译,可以但没必要emmmmmmmm....然后发现居然奇卡无比,总会有几秒的延迟排查timephp......
  • 09-Go设计模式-模板方法模式
    模板方法模式示例代码/*模板方法模式模板方法模式中的角色和职责AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体......
  • java 中级进阶高级 java 23种设计模式 视频教程 详细介绍+代码详解 +应用场景分析+
    ​​​​java中级进阶高级23种设计模式详细介绍+代码详解2019-04-06日最新更新蒋浩宇技术总监/CTO/高级工程师/技术专家主要讲解关于java、python、c++、前段、html5、jq......
  • 工厂模式
    三、工厂模式1.作用完成创建者和调用者的分离。2.分类简单工厂模式:就是一个工厂去创建所有东西。  classCar1{publicvoidproduct(){System......
  • python内置模块loggin日志实现单例封装
    1importlogging2fromconfigs.global_dataimportLogger345classLogHandler:6obj=None78def__init__(self):9self.file......