首页 > 其他分享 >【设计模式】单例模式——clone()方法破坏单例模式的情景

【设计模式】单例模式——clone()方法破坏单例模式的情景

时间:2024-01-02 15:03:09浏览次数:24  
标签:Singleton return 对象 clone 模式 单例 设计模式 public

Java的对象不仅可以new关键字产生,也可以利用clone()方法产生,或者利用反射和反序列化产生。用DCL或静态内部类实现单例模式都是利用private修饰构造函数来解决new关键字产生多个对象的问题的,但单例模式仍然可以被clone()方法、反射和反序列化破坏。

如下代码所示,让单例类实现Cloneable接口,同时重写clone()方法:

// Cloneable接口的作用是让clone()生效
public class Singleton implements Cloneable{
    private static Singleton instance = new Singleton();
    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }

    @Override
    public Singleton clone(){
        try{
            return (Singleton) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

比较原始对象与克隆对象

Singleton singleton = Singleton.getInstance();
Singleton singletonClone = singleton.clone();
System.out.println("比较原型对象与克隆对象:"+(singleton == singletonClone));

运行结果:

比较原型对象与克隆对象:false

从结果上看,确实创建了两个不同的对象。为了防止clone()方法破坏单例模式的解决思路非常简单,只要单例类不实现Cloneable接口即可,或者用如下方式重写clone()方法:

@Override
public Singleton clone(){
		return instance;
}





标签:Singleton,return,对象,clone,模式,单例,设计模式,public
From: https://blog.51cto.com/dongfeng9ge/9069823

相关文章

  • 一款降压型开关模式转换器解决方案
    一、基本概述TX4145是一款降压型开关模式转换器。TX4145在6-60V宽输入电源范围内实现不同峰值输出电流,并且具有出色的线电压和负载调整率。TX4145采用PWM电流模工作模式,环路易于稳定并提供快速的瞬态响应。TX4145外部提供FS脚,可通过外接一个电阻设置工作频率。TX4145集成......
  • 一款降压型开关模式转换器解决方案
    一、基本概述TX4145是一款降压型开关模式转换器。TX4145在6-60V宽输入电源范围内实现不同峰值输出电流,并且具有出色的线电压和负载调整率。TX4145采用PWM电流模工作模式,环路易于稳定并提供快速的瞬态响应。TX4145外部提供FS脚,可通过外接一个电阻设置工作频率。TX4145集成......
  • 小谈设计模式(28)—解释器模式
    (小谈设计模式(28)—解释器模式)专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。解释器模式解释器模式是一种行为型设计模式,它提供了一种解释一个语言的方式,用于解析......
  • js设计模式之单例模式
    //字面量constlogi={name:"贾维斯",password:'123456',method:function(){}}/***闭包:*1.闭包是指有权访问另一个函数作用域中的变量的函数*2.创建闭包的常见方式,就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,*优点:*......
  • Spring如何利用三级缓存解决单例Bean的循环依赖
    循环依赖:就是N个类循环(嵌套)引用。通俗的讲就是N个Bean互相引用对方,最终形成闭环。用一幅经典的图示可以表示成这样(A、B、C都代表对象,虚线代表引用关系):注意:其实可以N=1,也就是极限情况的循环依赖:自己依赖自己可以设想一下这个场景:如果在日常开发中我们用new对象的方式,若构造......
  • Spark 3.5.0 独立部署(Standalone)模式
    1.下载Spark3.5.0https://spark.apache.org/downloads.html2.安装JDKLinux安装Openjdk3.安装HadoopHadoop-3.3.6分布式集群搭建步骤4.解压mkdir/usr/sparktar-zxvfspark-3.5.0-bin-hadoop3.tgz-C/usr/spark/5.配置1.修改集群节点配置......
  • 基于Spring Boot2.x 设置 Spring Cloud Gateway 限流(令牌桶模式)
    参考https://blog.csdn.net/yuanchangliang/article/details/109579705https://blog.csdn.net/qq_38380025/article/details/102968559https://blog.csdn.net/ctwy291314/article/details/129425512https://blog.csdn.net/wxxiangge/article/details/95024214https://blog......
  • Java 中设计模式
    Java中一般认为有23种设计模式,当然暂时不需要所有的都会,但是其中常见的几种设计模式应该去掌握。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模......
  • 一文了解8种常用的软件架构模式
    软件架构模式是软件开发的基础,决定了软件各个功能模块之间的层级关系、依赖关系、通信方式,也影响着软件的开发、调试、运维和升级方式。本文重点讲解在软件开发中,8种常见的架构模式,欢迎阅读。 分层模式分层模式基本上是软件中最常用、最普遍的模式。顾名思义,在分层架构中,一......
  • 策略设计模式(Strategy)
    策略设计模式(Strategy):可以整体的替换一个算法的实现部分,能够整体的替换算法,能让我们轻松地用不同方法解决同一个问题。 1. 示例程序举一个收银的例子,普通用户打95折,会员打8折,超级会员打6折。如果在一个函数里面去解决这些问题,那么增加会员类型和折扣变化的时候会导致代码臃肿,难......