小白都能懂的设计模式 java版 原型模式 存在浅拷贝问题以及解决办法(超详细)
在这一节里,https://blog.csdn.net/weixin_45806131/article/details/109282894
是一个浅拷贝,v1和v2同时指向date,
写个例子:
package prototype;import java.util.Date;//客户端
public class Bilibili {public static void main(String[] args) throws CloneNotSupportedException {//原型对象Date date = new Date();Video v1 = new Video("笑笑", date);Video v2 = (Video) v1.clone();System.out.println("v1 = " + v1);System.out.println("v2 = " + v2);System.out.println("**************");date.setTime(123456);System.out.println("v1 = " + v1);System.out.println("v2 = " + v2);}
}
说明v1改变了,v2作为v1的引用,也变化了,这就是一个浅拷贝
理论上应该v2也有一个自己的date,也就是进行一个深拷贝,比如像是这种
解决方法:
将对象的属性也进行克隆
package prototype1;import java.util.Date;public class Video implements Cloneable {private String name;private Date creatTime;@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone();Video v = (Video) obj;//将这个对象的属性也进行克隆,可以实现深克隆,除了这个方法,还可以序列化和反序列化v.creatTime = (Date)this.creatTime.clone();return obj;}public Video() {}public Video(String name, Date creatTime) {this.name = name;this.creatTime = creatTime;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getCreatTime() {return creatTime;}public void setCreatTime(Date creatTime) {this.creatTime = creatTime;}@Overridepublic String toString() {return "Video{" +"name='" + name + '\'' +", creatTime=" + creatTime +'}';}
}
再重新跑一下原来的方法:
package prototype1;import java.util.Date;//客户端
public class Bilibili {public static void main(String[] args) throws CloneNotSupportedException {//原型对象Date date = new Date();Video v1 = new Video("笑笑", date);Video v2 = (Video) v1.clone();System.out.println("v1 = " + v1);System.out.println("v2 = " + v2);System.out.println("**************");date.setTime(123456);System.out.println("v1 = " + v1);System.out.println("v2 = " + v2);}
}
发现v1改变了,但是v2还是原来的数值,也就是实现了深克隆
原型模式也会和其他模式一起去使用,比如工厂模式,之前工厂模式中是利用new来创建的,也可以通过原型模式克隆来实现
创建型模式就是这么几种:单例模式,工厂模式,抽象工厂模式,建造者模式以及原型模式
好了,今天就到这里~
小白都能懂的设计模式 java版 原型模式 存在浅拷贝问题以及解决办法(超详细)相关推荐
- 小白都能懂的设计模式 java版 抽象工厂模式 实战练习(超详细)
比如要生产华为手机,华为路由器,小米手机,小米路由器 先写路由器和手机的接口: package abstract1;//手机产品接口 public interface IphoneProduct {v ...
- 小白都能懂的设计模式 java版 静态代理模式实战练习(超详细)
静态代理: 角色分析: 抽象角色:一般使用接口或者是抽象类来解决 真实角色:被代理的角色 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户:访问代理对象的人 以一个租房子的例子来 ...
- 模式——工程化实现及扩展(设计模式Java 版)
-- 模式--工程化实现及扩展(设计模式Java 版) 王翔,孙逊著 ISBN 978-7-121-15638-0 2012年4月出版 定价:59.00元 16开 416页 内 容 简 介 设计模式不 ...
- 9篇小白都能懂系列博客学完MySQL基础
博主经过三天的时间整理终于把MySOL基础部分内容总结成了这九篇博客,如果博主漏写了重点的基础部分的内容,或者说博主写的地方有错误还请CSDN的兄弟们提醒(这一点就比较重要了),由于博主的时间比较有限 ...
- Java描述设计模式(05):原型模式
一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...
- 设计模式之【原型模式】,深入理解深拷贝与浅拷贝
文章目录 一.什么是原型模式 二.原型模式实现方式 1.传统方式 2.原型模式 熟悉浅拷贝和深拷贝 浅拷贝实现对象克隆 深拷贝实现对象克隆 一.什么是原型模式 原型模式: 用一个已经创建的实例作为原型 ...
- 在Firefox国际版使用中国版账户(火狐通行证)傻瓜解决办法
更新://--国内版的扩展在这:http://mozilla.com.cn/moz-addon.html 在Firefox国际版使用中国版账户(火狐通行证)傻瓜解决办法-论坛-深度科技 (deepin ...
- Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法
问题概述: 使用 Spring Boot-2.0.3 进行项目开发,在配置 Druid 数据监控时,遇到缺包的问题,测试连接操作时报错,导致测试一直无法通过,部分信息如下: Caused by: ja ...
- java算法竞赛必备之快读快写(超详细解读)
java算法竞赛必备之快读快写(超详细解读) java写算法的缺点:速度慢.读写复杂.莫名WA(错误答案).TL(超时).CL(超内存)- (那我们还学个啥啊,都转c++写算法不香嘛.)别急别急,有缺 ...
最新文章
- [转]QT中QString与string的转化,解决中文乱码问题
- mysql 的条件 if else_使用If else条件在mysql中选择列?
- java中整数的整数次方_数值的整数次方 - 剑指 Offer 学习心得_教程_Java开发社区...
- html div float center,跨浏览器实现float:center
- Postgresql 按30分钟、小时、天分组
- Megcup 2017 决赛第一题 规则
- 一文详解枚举器和迭代器!
- pdf报表的制作入门,JasperReport
- TCPIP详解 卷一核心概念整理
- idea中XML注释与取消注释快捷键
- python socket和多线程实现多人对话聊天室
- 用matlab调节窗宽窗位的代码,基于HTML5的PACS HTML5图像处理(7)实现客户端JS调整窗宽窗位...
- Latex之在caption里加footnote
- 重置微信内置浏览器字体大小
- n平方的求和公式_1到N的平方和,立方和公式是怎么推导的
- arm linux 汇编.text .global 是什么意思?
- 联想lenovo进bios
- 网络里面可以看到计算机打不开,为什么电脑有网络但是打不开网页?
- 如何下载jquery的jar包
- 霍尔开关在电子烟中的应用
热门文章
- Python爬取网易云音乐1万条评论,感受到疫情下的真情
- 化为最简与或式:Y(A,B,C)=Σm(0,1,2,3,6,7)
- 嵌入式中文输入法字码表
- SQL Server 中 EXEC全称execute 与 SP_EXECUTESQL动态执行sql代码语句 的区别
- 数据结构与算法入门(Java)
- coreseek中文搜索引擎简述及使用
- 全国大学生数学建模竞赛2020A题炉温曲线MATLAB程序
- java基础练习题:交路费
- 2020_Nginx面试题了解一下
- 使用python计算BMI的程序