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

设计模式-单例模式

时间:2023-08-19 22:34:04浏览次数:53  
标签:null private INSTANCE static 模式 单例 Singleton3 设计模式 public

  1. 饿汉式
/**
 * 饿汉式,类加载的时候就会初始化
 *
 *   问题:
 *   1. 通过反射可以破坏单例
 *   2. 通过反序列化破坏单例
 *   3. 通过Unsafe破坏单例,无法解决 
 *
 * @author: optimjie
 * @date: 2023-08-19 21:37
 */
public class Singleton1 {

    private Singleton1() {
        System.out.println("private Singleton1");
    }

    private static final Singleton1 INSTANCE = new Singleton1();

    public static Singleton1 getInstance() {
        return INSTANCE;
    }

}

/**
 * 饿汉式,解决上述问题
 *
 * @author: optimjie
 * @date: 2023-08-19 21:44
 */
class Singleton2 {

    private Singleton2() {
        if (INSTANCE != null) {  // 解决问题1
            throw new RuntimeException("单例对象不能重复创建");
        }
        System.out.println("private Singleton1");
    }

    private static final Singleton2 INSTANCE = new Singleton2();

    public static Singleton2 getInstance() {
        return INSTANCE;
    }

    public Object readResolve() {  // 解决问题2,反序列化时直接调用该方法
        return INSTANCE;
    }
}
  1. 懒汉式
/**
 * 懒汉式
 *
 *   问题:
 *   1. 线程安全问题
 *
 * @author: optimjie
 * @date: 2023-08-19 21:55
 */
public class Singleton3 {

    private Singleton3() {
        System.out.println("private Singleton3");
    }

    private static Singleton3 INSTANCE = null;

    public static Singleton3 getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Singleton3();
        }
        return INSTANCE;
    }

}

/**
 * 懒汉式,解决上面问题
 *
 *   问题:
 *   1. 每一次调用getInstance时都会加锁,但实际上只有一开始还没有创建Singleton4时才会有可能出现问题,
 *      因此需要进一步优化
 *
 * @author: optimjie
 * @date: 2023-08-19 22:07
 */
class Singleton4 {

    private Singleton4() {
        System.out.println("private Singleton3");
    }

    private static Singleton4 INSTANCE = null;

    public static synchronized Singleton4 getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Singleton4();
        }
        return INSTANCE;
    }

}

/**
 * 懒汉式,优化上面的问题,也称为双检锁优化,DCL
 *
 * @author: optimjie
 * @date: 2023-08-19 22:09
 */
class Singleton5 {

    private Singleton5() {
        System.out.println("private Singleton3");
    }

    private static volatile Singleton5 INSTANCE = null;  // 加volatile的原因,详情看volatile的那篇

    public static Singleton5 getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton5.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton5();
                }
            }
        }
        return INSTANCE;
    }

}








说明

===================================

仅作为校招时的《个人笔记》,详细内容请看【参考】部分

===================================

参考

  1. B站,黑马满老师

标签:null,private,INSTANCE,static,模式,单例,Singleton3,设计模式,public
From: https://www.cnblogs.com/optimjie/p/17643187.html

相关文章

  • 正则表达式:贪婪与非贪婪模式
    正则中的三种模式,贪婪匹配、非贪婪匹配和独占模式。在这6种元字符中,我们可以用{m,n}来表示(*)(+)(?)这3种元字符:贪婪模式,简单说就是尽可能进行最长匹配。非贪婪模式呢,则会尽可能进行最短匹配。正是这两种模式产生了不同的匹配结果。贪婪匹配(Greedy)在正则中,表示次数的量词默认是贪......
  • 适配器模式
    将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。参考:https://baike.baidu.com/item/%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F/10218946?fr=ge_ala......
  • 【补充】Python中实现单例模式的六种常见方法
    【补充】Python中实现单例模式的六种常见方法【1】类属性:classSingleton:instance=None@classmethoddefgetInstance(cls):ifcls.instanceisNone:cls.instance=Singleton()returncls.instance使用类属性保存实......
  • 【补充】软件开发模式对比(瀑布、迭代、螺旋、敏捷)
    【补充】软件开发模式对比(瀑布、迭代、螺旋、敏捷)【1】瀑布模式(WaterfallModel):介绍:瀑布模式是一种线性的开发模式,各个阶段按顺序依次执行,每个阶段严格依赖前一阶段的输出。开发过程划分为需求分析、系统设计、编码、测试和运维等阶段。每个阶段的结果都在下一个阶段开始......
  • 设计模式串讲
    BehavioralDesignPatterns行为模式行为模式负责对象之间的高效沟通和职责委派,这些模式刻画了运行时难以跟踪的复杂控制流,从而把开发者的注意力从控制流转移到对象间的联系方式上。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。行为类模式使用继承机制在类间分派......
  • FacadePattern-门面模式
    在C#中,门面模式(FacadePattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问复杂子系统中的一组接口。门面模式隐藏了子系统的复杂性,为客户端提供了一个简单的接口,使得客户端更易于使用子系统。门面模式具有以下几个关键角色:Facade(门面):是门面模式的核心,它提供了一个简单......
  • Squid代理服务之反向代理模式
    为公网用户做加速访问1)实验拓扑2)web服务器配置参考传统模式中的web服务器配置,这里不再重复记录操作。网关需要指向squid服务器的内网ipecho"GATEWAY=10.10.10.13">>/etc/sysconfig/network-scripts/ifcfg-ens333)安装squid服务安装步骤这里不再赘述,参考传统模式中的安装步骤。(1)开......
  • 剖析MongoDB数据库:理解NoSQL设计模式、优化查询性能和数据安全性
    MongoDB是一个流行的NoSQL文档数据库,它使用JSON样式的文档存储数据。本文将对MongoDB进行剖析,包括NoSQL设计模式、优化查询性能和数据安全性。NoSQL设计模式文档数据库MongoDB采用文档数据库的设计模式,即将相关数据保存在单个文档中,而不是将其拆分成多个表。这种设计模式使得数......
  • Squid代理服务之透明模式部署
    为内网用户做加速访问,客户端无需手动设置代理即可访问公网中的web服务器。1)实验拓扑2)修改squid配置文件指定squid为透明模式vim/etc/squid/squid.confhttp_port10.10.10.12:3128transparent(透明模式)visible_hostnamelvs_backup(不添加也可以)3)配置iptables策略vim......
  • DecoratorPattern-装饰器模式
    在C#中,装饰器模式(DecoratorPattern)是一种结构型设计模式,它允许您在不改变现有对象的情况下动态地向其添加功能。装饰器模式通过将对象包装在装饰器对象中来实现,在运行时动态地添加新的行为或修改现有行为。装饰器模式有以下几个关键角色:Component(组件):定义了一个抽象接口,可以是......