在这一节里,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版 原型模式 存在浅拷贝问题以及解决办法(超详细)相关推荐

  1. 小白都能懂的设计模式 java版 抽象工厂模式 实战练习(超详细)

    比如要生产华为手机,华为路由器,小米手机,小米路由器 先写路由器和手机的接口: package abstract1;//手机产品接口 public interface IphoneProduct {v ...

  2. 小白都能懂的设计模式 java版 静态代理模式实战练习(超详细)

    静态代理: 角色分析: 抽象角色:一般使用接口或者是抽象类来解决 真实角色:被代理的角色 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户:访问代理对象的人 以一个租房子的例子来 ...

  3. 模式——工程化实现及扩展(设计模式Java 版)

    -- 模式--工程化实现及扩展(设计模式Java 版) 王翔,孙逊著 ISBN 978-7-121-15638-0 2012年4月出版 定价:59.00元 16开 416页 内 容 简 介 设计模式不 ...

  4. 9篇小白都能懂系列博客学完MySQL基础

    博主经过三天的时间整理终于把MySOL基础部分内容总结成了这九篇博客,如果博主漏写了重点的基础部分的内容,或者说博主写的地方有错误还请CSDN的兄弟们提醒(这一点就比较重要了),由于博主的时间比较有限 ...

  5. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  6. 设计模式之【原型模式】,深入理解深拷贝与浅拷贝

    文章目录 一.什么是原型模式 二.原型模式实现方式 1.传统方式 2.原型模式 熟悉浅拷贝和深拷贝 浅拷贝实现对象克隆 深拷贝实现对象克隆 一.什么是原型模式 原型模式: 用一个已经创建的实例作为原型 ...

  7. 在Firefox国际版使用中国版账户(火狐通行证)傻瓜解决办法

    更新://--国内版的扩展在这:http://mozilla.com.cn/moz-addon.html 在Firefox国际版使用中国版账户(火狐通行证)傻瓜解决办法-论坛-深度科技 (deepin ...

  8. Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法

    问题概述: 使用 Spring Boot-2.0.3 进行项目开发,在配置 Druid 数据监控时,遇到缺包的问题,测试连接操作时报错,导致测试一直无法通过,部分信息如下: Caused by: ja ...

  9. java算法竞赛必备之快读快写(超详细解读)

    java算法竞赛必备之快读快写(超详细解读) java写算法的缺点:速度慢.读写复杂.莫名WA(错误答案).TL(超时).CL(超内存)- (那我们还学个啥啊,都转c++写算法不香嘛.)别急别急,有缺 ...

最新文章

  1. [转]QT中QString与string的转化,解决中文乱码问题
  2. mysql 的条件 if else_使用If else条件在mysql中选择列?
  3. java中整数的整数次方_数值的整数次方 - 剑指 Offer 学习心得_教程_Java开发社区...
  4. html div float center,跨浏览器实现float:center
  5. Postgresql 按30分钟、小时、天分组
  6. Megcup 2017 决赛第一题 规则
  7. 一文详解枚举器和迭代器!
  8. pdf报表的制作入门,JasperReport
  9. TCPIP详解 卷一核心概念整理
  10. idea中XML注释与取消注释快捷键
  11. python socket和多线程实现多人对话聊天室
  12. 用matlab调节窗宽窗位的代码,基于HTML5的PACS HTML5图像处理(7)实现客户端JS调整窗宽窗位...
  13. Latex之在caption里加footnote
  14. 重置微信内置浏览器字体大小
  15. n平方的求和公式_1到N的平方和,立方和公式是怎么推导的
  16. arm linux 汇编.text .global 是什么意思?
  17. 联想lenovo进bios
  18. 网络里面可以看到计算机打不开,为什么电脑有网络但是打不开网页?
  19. 如何下载jquery的jar包
  20. 霍尔开关在电子烟中的应用

热门文章

  1. Python爬取网易云音乐1万条评论,感受到疫情下的真情
  2. 化为最简与或式:Y(A,B,C)=Σm(0,1,2,3,6,7)
  3. 嵌入式中文输入法字码表
  4. SQL Server 中 EXEC全称execute 与 SP_EXECUTESQL动态执行sql代码语句 的区别
  5. 数据结构与算法入门(Java)
  6. coreseek中文搜索引擎简述及使用
  7. 全国大学生数学建模竞赛2020A题炉温曲线MATLAB程序
  8. java基础练习题:交路费
  9. 2020_Nginx面试题了解一下
  10. 使用python计算BMI的程序