Java设计模式中原型模式是啥/浅克隆与深克隆又是什么/clone方法怎么回事

news2024/12/23 16:04:21

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!

4.5 原型模式

4.5.1 概述

用已创建实例作为原型,通过复制该原型对象来创建一个和原型对象一样的新对象

4.5.2 结构

  • 抽象原型类:规定具体原型对象必须实现的clone()方法
  • 具体原型类:实现抽象原型类中方法,是可被复制对象
  • 访问类:使用具体原型类中clone方法来复制新对象

4.5.3 分类

  • 浅克隆:创建对象,新对象属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向对象内存地址
  • 深克隆:创建对象,属性中引用其他对象会被克隆,不再指向原有对象地址
  1. Java中的Object类提供clone()方法实现浅克隆
  2. Java 中的 Cloneable 接口是抽象原型类,而实现了 Cloneable 接口的子实现类就是具体的原型类

4.5.4 验证浅克隆

  • 验证Object类clone()实现浅克隆
  • 具体原型
public class RealizeType implements Cloneable{  
    public RealizeType(){  
        System.out.println("具体原型创成功");  
    }  
    @Override  
    public RealizeType clone() throws CloneNotSupportedException {  
        System.out.println("克隆具体原型成功!");  
        return (RealizeType) super.clone();  
    }  
}
  • 测试
    public static void main(String[] args) throws Exception {  
//        创建具体原型对象  
        RealizeType realizeType = new RealizeType();  
//        克隆  
        RealizeType clone = realizeType.clone();  
        System.out.println("原型对象与克隆对象是否是同一个对象?" + (realizeType == clone ));  
    }

结果符合预期
![[Pasted image 20221229214315.png]]
# 注意:
java.lang.object规范中对clone方法的约定

  1. 对任何的对象x,都有x.clone() !=x 因为克隆对象与原对象不是同一个对象
  2. 对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样
  3. 如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立

4.5.5 使用场景

  • 对象创建比较复杂,可用原型模式快速创建对象
  • 性能和安全要求高

4.5.6 案例

  • 学生类
public class Student{  
    private String name;  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
}
  • 引用类
public class Citation implements Cloneable {  
    private Student student;  
    public Student getStudent() {  
        return student;  
    }  
    public void setStudent(Student student) {  
        this.student = student;  
    }  
    @Override  
    public Citation clone() throws CloneNotSupportedException {  
        return (Citation) super.clone();  
    }  
    public void show()  
    {  
        System.out.println(student.getName() + "是好学生");  
    }
}
  • 测试结果如图
    ![[Pasted image 20221229223250.png]]
public static void main(String[] args) throws CloneNotSupportedException {  
    Citation citation = new Citation();  
    Student student = new Student();  
    student.setName("张三");  
    citation.setStudent(student);  
    Citation clone = citation.clone();  
    clone.getStudent().setName("李四");  
    citation.show();  
    clone.show();  
}

4.5.7 深克隆

5.7.1 序列化与反序列化

  • 使用浅克隆案例
  • 给Citation类和学生类实现序列化接口
  • 修改测试类
public static void main(String[] args) throws Exception {  
    Citation citation = new Citation();  
    Student student = new Student();  
    student.setName("张三");  
    citation.setStudent(student);  
    ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("./b.txt"));  
    outputStream.writeObject(citation);  
    outputStream.close();  
    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("./b.txt"));  
    Citation citation1 = (Citation) objectInputStream.readObject();  
    objectInputStream.close();  
    citation.show();  
    citation1.getStudent().setName("李四");  
    citation1.show();  
}

结果
![[Pasted image 20221229224947.png]]

5.7.2 重写clone方法

  • 重写Citation类方法
@Override  
public Citation1 clone() throws CloneNotSupportedException {  
    Student student1 = new Student();  
    student1.setName(student.getName());  
    Citation1 citation1 = new Citation1();  
    citation1.setStudent(student1);  
    return citation1; 
}
  • 测试
    ![[Pasted image 20221229230006.png]]
public static void main(String[] args) throws CloneNotSupportedException {  
    Citation1 citation = new Citation1();  
    Student student = new Student();  
    student.setName("张三");  
    citation.setStudent(student);  
    Citation1 clone = citation.clone();  
    clone.getStudent().setName("李四");  
    citation.show();  
    clone.show();  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker系列 深度使用nextcloud(九) 硬盘挂载

转自我的个人博客https://blognas.hwb0307.com,该文的内容更新仅在个人博客可见。欢迎关注! 前言 基于《Docker系列 搭建个人云盘服务nextcloud》,相信无论是在有/无443端口的Linux机子里均可成功安装Nextcloud。值得一提的是,Ne…

02、做点准备工作 osg\openscenegraph源代码下载 C++三维视频融合实战系列(时空克隆)

首先,要有一点C编程基础,熟悉VS2013开发环境。 在开始实践之前,先要搭建号VS2013开发环境。 然后,建议电脑安装windows 10 64位操作系统。 接下来需要在以下地址下载开源代码: 1、osg下载 打开openscenegraph主页…

CSS权威指南(七)视觉格式化

文章目录1.盒模型2.元素的显示方式3.行内元素1.盒模型 不管是什么元素,CSS都假定每个元素会生成一个或多个矩形框,我们称之为元素。各元素框的中心是内容区域,四周有可选的内边距、边框、轮廓和外边距。默认情况下,内容区的背景出现在内边距范围内。外边…

5分钟搞懂用户态,内核态

5分钟搞懂用户态,内核态 1. 什么是用户态,内核态 用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。 用户态,内核态…

进制详解:二进制、八进制和十六进制

进制详解:二进制、八进制和十六进制 背景(Contexts) 我们平时使用的数字都是由 0~9 共十个数字组成的,例如 1、9、10、297、952 等,一个数字最多能表示九,如果要表示十、十一、二十九、一百等,…

机器学习笔记之深度信念网络(一)背景介绍与模型表示

机器学习笔记之深度信念网络——背景介绍与模型表示引言深度信念网络场景构建深度信念网络的联合概率分布引言 从本节开始,将介绍深度信念网络。 深度信念网络 深度信念网络(Deep Belief Network,DBN)是杰弗里辛顿(Geoffrey Hinton)于2006年提出的模型&#xff0…

Day853.WorkerThread模式 -Java 性能调优实战

WorkerThread模式 Hi,我是阿昌,今天学习记录的是关于WorkerThread模式的内容。 Thread-Per-Message 模式,对应到现实世界,其实就是委托代办。这种分工模式如果用 Java Thread 实现,频繁地创建、销毁线程非常影响性能…

场景编程集锦 - 吉米的总统梦想

1. 场景描述 吉米是太平洋岛国一个贫苦家庭的孩子,他的梦想就是当总统,引领国家走向富强之路。 开学的第一堂课上,老师用白色的粉笔在黑板上写下了“我的梦想”,同学们都陷入了思考。大卫的梦想是当一名科学家,用奇思妙…

CSS初级教程(文本)【第六天】

文章目录【1】CSS 文本[字体颜色|背景色]【2】CSS 文本对齐【3】CSS 文字装饰【4】CSS 文本转换[大写或小写]【5】CSS 文字间距【6】CSS 文本阴影【7】所有 CSS 文本属性CSS上回学习链接 CSS初级教程 颜色【第一天】 CSS初级教程 背景【第二天】 CSS初级教程 边框【第三天】 CS…

Windows访问控制 -- SID

Windows访问控制是一个比较大的题目,因此计划用一系列的文章简单谈一下这个。本篇是开篇,介绍SID。 Windows访问控制定义 Windows访问控制的含义可以参考MSDN的描述:Access control refers to security features that control who can acce…

Java集合容器介绍

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示: Collection接口:单列数据,定义了存取一组对象的方法的集合 1、List:元素有序(指的是存储时,与存放顺序保持一致)、可重复的…

【Docker】(四)使用volume持久化Docker容器中的Redis数据

1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 (三)使用registry远程镜像仓库管理镜像…

[ 数据结构 ] 赫夫曼编码--------数据、文件压缩解压

0 引出 如上图:给定字符串按定长编码处理,最终对应二进制长度为359 思考:如何压缩,将359有效降低? ----回顾:赫夫曼树 1 数据压缩 拿到数据(字符串)的第一反应,虽然知道应该也像上面一样转为字节数组,但就不知道该怎么办了?统计数组中各字节使用的次数,将次数作为权值,字节…

2023.1.8 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.论文主要贡献5.相关工作5.1 序列感知的推荐系统5.2 神经注意模型6.模型:ATTREC6.1 序列推荐6.2 基于Self-Attention的用户短期兴趣建模6.3 用户长期兴趣建模6.4 模型学习7.实验7.1 数据集7.2 评估指标7.3 模型比较7.4 实验…

SSO单点登录实例详解(前端传Code授权登录)

什么是 SSO(单点登录) SSO 英文全称 Single Sign On,单点登录。SSO 是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 单点登录流程 单点登录大致流程如下所示: 单点登录详细流程&#x…

【自学C++】C++变量初始化

C变量初始化 C变量初始化教程 变量 的初始化就是在定义变量的同时,给变量设置一个初始值,在 C 中,如果定义变量没有初始化,那么变量有可能会被赋值也有可能不会赋值。 如果是定义的 全局变量 或者 静态变量,未初始化…

2022年语音合成(TTS)和语音识别(ASR)年度总结

论文统计每月更新一次,主要跟踪语音合成和语音识别的发展状况(很多文章都是在会议后才发出,但不影响统计。统计过程难免存在疏漏,因此统计结果仅供参考。所有文章语音合成领域统计列表请访问http://yqli.tech/page/tts_paper.html&#xff0c…

绝大多数人远远低估了软件开发的难度

给你付钱了,你应该把软件做好! 这个话相当于: 给你付钱了,你应该把月亮摘下来! 趣讲大白话:臣妾做不到 ********** 软件是特殊商品服务 可以说很难有标准 开发的难度取决于需求多少,技术难度&a…

Java Map集合的介绍和使用

什么是Map类型的集合 介绍 1.用于保存具有映射关系的数据(key——value)。 2.Map中的key和value可以是任意的类型的数据。 3.Map中的key值不允许重复。 4.Map中的value值可以重复。 5.一般常用string作为value的key。 6.key和value之间存在一一对…

如何进行地图SDK开发(二)——示例文档

概述 前面的文章文章我们写到了SDK的开发以及ak认证的实现,在本文我们继续讲讲地图SDK开发中的示例文档的实现。 技术点 vue3viteelement-plusmonaco-editor 实现后效果 实现 1. 工程初始化 1.1 搭建工程 搭建工程的过程请参照博文(使用vite搭建vue3项目&…