首页 > 其他分享 >设计模式之-单例模式

设计模式之-单例模式

时间:2023-11-28 20:01:22浏览次数:33  
标签:return Person3 private instance 模式 单例 设计模式 public

1、是什么?

单例模式是一种常用的软件设计模式,它在一个类中只允许创建一个对象实例,并且提供一个全局访问点来访问该实例。

2、怎么玩?

单例模式需要满足三个条件:单例类只能有一个实例;单例类必须自己创建自己的唯一实例;单例类必须给所有其他对象提供这一实例。

(1) 懒汉式
package com.ly.singleton;

/**
 * 单例模式-懒汉式
 *
 * @author ly (个人博客:https://www.cnblogs.com/ybbit)
 * @date 2023-10-31  0:00
 * @tags 喜欢就去努力的争取
 */
public class Person {
    private String name;
    private Integer age;

    public static Person instance;

    private Person() {
    }

    /**
     * 在需要的时候再去创建
     *
     * @return 实例对象
     */
    public static Person getInstance() {
        if (instance != null) {
            instance = new Person();
        }
        return instance;
    }
}
(2) 饿汉式
package com.ly.singleton;

/**
 * 单例模式-饿汉式
 *
 * @author ly (个人博客:https://www.cnblogs.com/ybbit)
 * @date 2023-10-31  0:02
 * @tags 喜欢就去努力的争取
 */
public class Person2 {

    private String name;

    private Integer age;

    /**
     * 上来就直接创建
     */
    private static final Person2 PERSON = new Person2();

    public static Person2 getInstance() {
        return PERSON;
    }
}

(3) 懒汉式的一些问题
package com.ly.singleton;

/**
 * 单例模式-懒汉式
 *
 * @author ly (个人博客:https://www.cnblogs.com/ybbit)
 * @date 2023-10-31  0:00
 * @tags 喜欢就去努力的争取
 */
public class Person3 {
    private String name;
    private Integer age;

    public static volatile Person3 instance;

    private Person3() {
    }

    /**
     * 静态方法
     * 锁太大效率太低
     *
     * @return 实例对象
     */
    public static synchronized Person3 getInstance1() {
        if (instance != null) {
            instance = new Person3();
        }
        return instance;
    }

    /**
     * 双重检索+内存可见性
     *
     * @return
     */
    public static Person3 getInstance2() {
        if (instance != null) {
            synchronized (Person3.class) {
                if (instance != null) {
                    instance = new Person3();
                }
            }
        }
        return instance;
    }

}

标签:return,Person3,private,instance,模式,单例,设计模式,public
From: https://www.cnblogs.com/ybbit/p/17799289.html

相关文章

  • 《游戏编程模式》笔记
    地址:https://gpp.tkchu.me/前言本文无参考价值,主要记录博主在学习本书时,觉得有用的东西不代表这些知识对你有用,也不代表没记录的东西对你没用,想学习请看上面的原文。设计模式状态机有限状态机层次状态机:部分状态可以通过继承,来处理通用的状态。比如在地面上按B,和在空中按B......
  • 中间件:Redis-x64-5.0.14.1高可用集群-哨兵(Sentinel)模式(Win10)
     原文:https://blog.csdn.net/chenyang_wei/article/details/127846656在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,......
  • URL绕过-后缀路径模式匹配设置错误绕过过滤器
    @ConfigurationpublicclassUrlMatchConfigextendsWebMvcConfigurationSupport{@OverridepublicvoidconfigurePathMatch(PathMatchConfigurerconfigurer){//setUseSuffixPatternMatch后缀模式匹配,如果设置为true,路径后面不管多少个//都能匹配......
  • 手动部署Kraft模式Kafka集群
    手动部署Kraft模式kafka集群基本信息IP地址HostnameReleaseKafka-Version172.29.145.157iamdemo1Centos7.9kafka_2.12-3.5.1172.29.145.182iamdemo2Centos7.9kafka_2.12-3.5.1172.29.145.183iamdemo3Centos7.9kafka_2.12-3.5.1下载安装包kafka安......
  • VMware虚拟机无法通过桥接上网/VMware桥接模式获取IP地址失败
    虚拟机需要通过桥接模式连接网络的时候总是获取IP地址失败,在不同网站搜索出来的结果全都像是同一个人发布的一样,让重置虚拟网络配置、手动指定桥接网卡又要关防火墙什么的。我不否认这些办法或许有用,但我都操作了一遍确实是没有解决任何问题。最终反复修改搜索关键词之后终于找到了......
  • 设计模式
    varobserver={list:[],subscribe:function(key,fn){if(!this.list[key]){this.list[key]=[]}this.list[key].push(fn)},publish:function(){constkey=arguments[0]this.list[key].forEach(fn=>{fn.apply(this,argu......
  • 查看网络ip,网络连接模式
    vmware提供了三种网络连接模式:桥接模式虚拟机直接连接外部物理网络的模式,主机起到了网桥的作用。这种模式下,虚拟机可以直接访问外部网络,并且对外部网络是可见的nat模式虚拟机和主机构建一个专用网络,并通过虚拟网络地址转换设备对ip进行转换,虚拟机通过共享主机ip可以访问外部网络,但......
  • 每日随笔——命令模式
    [实验任务一]:多次撤销和重复的命令模式某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现。实验要求:1.提交类图;2.提交源代码;3.注意编程规范。 AddCommandpack......
  • 职责链模式
    [实验任务一]:财务审批某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20万元以上的采购单需要开职工大会确定。现用职责链模式设计该系统。1......
  • 享元模式
    [实验任务一]:围棋设计一个围棋软件,在系统中只存在一个白棋对象和一个黑棋对象,但是它们可以在棋盘的不同位置显示多次。importjava.util.*;//坐标类:外部状态类classCoordinates{privateintx;privateinty;publicCoordinates(intx,inty){this.......