设计模式三(原型模式)

在开发过程中,创建多个数据相同的对象,每次new都开销比较大,在这里可以使用对象克隆,以先创建的原型对象为模板进行对象的复制。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用

浅克隆

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址

 
public class Person implements  Cloneable{​int num;String name;​public Person() {}​public Person(int num, String name) {this.num = num;this.name = name;}​public int getNum() {return num;}​public void setNum(int num) {this.num = num;}​public String getName() {return name;}​public void setName(String name) {this.name = name;}​​​@Overrideprotected Person clone() throws CloneNotSupportedException {Person person = (Person)super.clone();return person;}​@Overridepublic String toString() {return "Person{" +"num=" + num +", name='" + name + '\'' +'}';}}
 public class Test {​public static void main(String[] args) throws CloneNotSupportedException {​Person p1 = new Person(100,"jim");Person p2 =p1.clone();//clone方法 返回一个新对象p2.name = "tom";System.out.println(p1);//100 ,jimSystem.out.println(p2);//100 tom​System.out.println(p1==p2);//false​}}

深克隆

多层克隆

在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制

 public class Person implements  Cloneable{​int num;String name;Address address;​public Person() {​}​public Person(int num, String name) {this.num = num;this.name = name;}​public int getNum() {return num;}​public void setNum(int num) {this.num = num;}​public String getName() {return name;}​public void setName(String name) {this.name = name;}​public Address getAddress() {return address;}​public void setAddress(Address address) {this.address = address;}​@Overrideprotected Person clone() throws CloneNotSupportedException {Person person = (Person)super.clone();person.address = address.clone();   //深度复制  联同person中关联的对象也一同克隆.return person;}​@Overridepublic String toString() {return "Person{" +"num=" + num +", name='" + name + '\'' +", address=" + address +'}';}}​
 public class Address  implements Cloneable{​String  address;​public String getAddress() {return address;}​public void setAddress(String address) {this.address = address;}​@Overridepublic String toString() {return "Address{" +"address='" + address + '\'' +'}';}​@Overrideprotected Address clone() throws CloneNotSupportedException {return (Address) super.clone();}}

序列化

 
public class Address  implements Serializable {​String  address;​public String getAddress() {return address;}​public void setAddress(String address) {this.address = address;}​@Overridepublic String toString() {return "Address{" +"address='" + address + '\'' +'}';}​}
 
public class Person implements Serializable {​int num;String name;Address address;​public Person() {}​public Person(int num, String name) {this.num = num;this.name = name;}​public int getNum() {return num;}​public void setNum(int num) {this.num = num;}​public String getName() {return name;}​public void setName(String name) {this.name = name;}​public Address getAddress() {return address;}​public void setAddress(Address address) {this.address = address;}​/*** 自定义克隆方法* @return*/public Person myclone() {Person person = null;try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(this);// 将流序列化成对象ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);person = (Person) ois.readObject();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return person;}​​@Overridepublic String toString() {return "Person{" +"num=" + num +", name='" + name + '\'' +", address=" + address +'}';}}

 练习

题目页面 (kamacoder.com)

import java.util.Scanner;public class Main {public static void main(String[] args) throws CloneNotSupportedException {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();while(num-->0){String color = scanner.next();int width = scanner.nextInt();int height = scanner.nextInt();Prototype prototype = new Prototype(color, width, height);Prototype clone = prototype.clone();System.out.println(clone.toString());}}
}class Prototype implements Cloneable{private String color;private int width;private int height;public Prototype(String color, int width, int height) {this.color = color;this.width = width;this.height = height;}@Overridepublic String toString() {return "Color: " + color + ", Width: " + width + ", Height: " + height;}@Overrideprotected Prototype clone() throws CloneNotSupportedException {return (Prototype) super.clone();}}

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

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

相关文章

Python初学者学习记录——python基础综合案例:数据可视化——折线图可视化

一、案例介绍 效果一:2020年印美日新冠累计确诊人数 效果二:全国疫情地图可视化 效果三:动态GDP增长图 数据来源: 本案例数据全部来自《百度疫情实时大数据报告》,及公开的全球各国GDP数据 使用的技术: E…

C++爱好者的科目四易错点总结

科目四易错点总结 在科目四考试中,一部分内容是可以通过刷题快速掌握的,一部分内容缺因易混淆而降低我们的准确率,本文主要对后者进行总结,期待大家补充与指正。 注: 本文不是全部的知识点总结处 本文不是权威机构 本文…

张维迎《博弈与社会》笔记(3)导论:一些经济学的基础知识

这篇的主要内容介绍了经济学的基础知识吧。 经济学、社会学、心理学的区别 经济学与社会学的区别与共同点 经济学一般是从个人的行为出发解释社会现象(from micro to macro)。社会学的传统方法则是从社会的角度来解释个人的行为(from macro…

硕士毕业论文如何体现自己的工作量

一、工作量是什么 工作量就是你在科研过程中做的所有工作量的体现,包括你对背景的调查,对问题的发现,你做的实验,提出的创新点。 notice:任何别人做的实验,提出的模型,都不能算是你的工作量。…

uniapp+vue3+ts --微信小程序tab导航可以上下滚动选中选项组件代码

uniappvue3ts --微信小程序tab导航可以上下滚动选中选项组件代码 废话不多说&#xff0c;直接上代码。 组件代码&#xff1a; <template><view class"scroll-tabs-container"><view class"radiusz bg-white pt-[10rpx] z-[999]" :class&…

文件包含漏洞长度截断

长度截断 文件漏洞的利用方式什么是长度截断通过实操理解00截断对版本要求更高一点&#xff0c;而长度截断则是利用了windows的系统漏洞&#xff0c;就是windows文件名&#xff08;就是文件名后缀之后&#xff09;之后如果有空格&#xff0c;或者是点都会被忽略掉&#xff0c;也…

Oracle报错:ORA-08002: sequence CURRVAL is not yet defined in this session

问题 直接查询序列的当前值&#xff0c;然后报了这个错误。 SELECT HR.EMPLOYEES_SEQ.CURRVAL; ORA-08002: sequence CURRVAL is not yet defined in this session解决 ORA-08002错误是Oracle数据库中的一个常见错误&#xff0c;它表示在当前会话中未定义序列的CURRVAL值。这…

Python tkinter (6) —— Listbox控件

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按钮与复选框 目录…

【并发编程】volatile原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 volatile原理实现是内存屏障&#xff0c;Memory Barrier 对volatile变量的写指令后会加入写屏障。对volatile变量的读指令前会加入读屏障 如何…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-2 JavaScript 获取HTML元素对象

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>JavaScript 获取 HTML 元素对象</title> </head><body> <input type"text" value"admin" /> <br> <input …

【深度学习:t-SNE 】T 分布随机邻域嵌入

【深度学习&#xff1a;t-SNE 】T 分布随机邻域嵌入 降低数据维度的目标什么是PCA和t-SNE&#xff0c;两者有什么区别或相似之处&#xff1f;主成分分析&#xff08;PCA&#xff09;t-分布式随机邻域嵌入&#xff08;t-SNE&#xff09; 在 MNIST 数据集上实现 PCA 和 t-SNE结论…

数据中心代理IP:最优性价比业务应用指南

数据中心代理IP在应对高速高并发的业务时&#xff0c;以独特的高速传输&#xff0c;游刃有余地应对多任务处理&#xff0c;适合于特定业务场景的高效加速。理性选用数据中心代理IP&#xff0c;可以为业务将迎来更加稳健和迅速的发展。今天&#xff0c;我们将揭示数据中心代理IP…

Python代码耗时统计

time模块 在代码执行前后各记录一个时间点&#xff0c;两个时间戳相减即程序运行耗时。这种方式虽然简单&#xff0c;但使用起来比较麻烦。 time.time() 函数返回的时间是相对于1970年1月1日的秒数 import timestart time.time() time.sleep(1) end time.time() print(f&…

flutter 搜索框实现,键盘搜索按钮,清空,防抖

import package:flutter/material.dart; import package:flutter_screenutil/flutter_screenutil.dart; import package:flutter_svg/svg.dart; import package:sy_project/config/app_colors.dart; import package:sy_project/core/assets.dart;/// 搜索textview class Custom…

JavaSE核心基础-面向对象一 - 类和对象 成员变量与局部变量-知识点

1.面向对象的特点 ①.面向对象是一种常见的思想&#xff0c;比较符合人们的思考习惯&#xff1b; ②.面向对象可以将复杂的业务逻辑简单化&#xff0c;增强代码复用性&#xff1b; ③.面向对象具有抽象、封装、继承、多态等特性。 2.面向对象的三大特征 ①.封装性 封装是面向对…

【MIdjourne基础】 |MIdjourney基础参数全解析,各类辅助知识

文章目录 1 参数列表1.1 基础参数列表 2 基础参数详解2.1 模型版本选择2.2 模型出图模式选择2.3 基础生图参数2.3.1 --ar2.3.2 --stylize2.3.3 --no2.3.4 --chaos2.3.5 --quality2.3.6 --stop2.3.7 --hd2.3.8 --repeat 1 参数列表 1.1 基础参数列表 模型版本选择 目标参数作…

Linux delay相关函数实现

1、udelay 与 sleep 相关函数相比&#xff0c;delay 的最大区别是忙等、一直占用 CPU&#xff0c;而 sleep 会让出 CPU 控制权。 mdelay、ndelay都是基于 udelay 来实现的。在 include/linux/delay.h 中&#xff0c;如下&#xff1a; /** Using udelay() for intervals grea…

杂项基础知识

换行与回车 ASCII中的CR与LF CR&#xff08;Carriage Return&#xff09;&#xff0c;回车字符\r&#xff0c;控制字符&#xff0c;将光标移动到本行行首 LF&#xff08;Line Feed&#xff09;&#xff0c;换行字符\n&#xff0c;控制字符&#xff0c;将光标下移一行 ASCII…

开源项目对于新用户和初学者适合哪些工作

目录 一、阅读和理解文档 二、报告问题 三、测试和验证修复 四、编写和更新文档 五、简单的代码更改和修复 六、参与社区讨论 开源项目对于新用户和初学者来说&#xff0c;提供了宝贵的学习和实践机会。以下是一些适合新用户和初学者参与的工作&#xff1a; 一、阅读和理…

【2024美赛实战】预测模型:灰色预测模型GM(1,1)

当题目数据少且无明显规律的时候&#xff0c;且要求进行短期预测的时候&#xff0c;或许可以考虑另一种预测方法——灰色预测模型GM(1,1)&#xff0c;虽然是个比较基础的预测模型&#xff0c;但在美赛O奖论文中登场次数也是比较多的。 一 预测问题的一般步骤 二 灰色预测模型…