概念:

 * 原型模式:也可以说是克隆模式。*  通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以用原型模式。*  就是java的克隆技术,以某个对象为原型,复制出新的对象,显然,新的对象具备原型对象的特点。*  优势:效率高:直接克隆,避免了重新执行构造过程步骤。*  克隆不同于new,new出来的对象属性是默认值,克隆出来的属性完全和原型相同,并且修改不会影响到*  原型。

实现:

 * 实现:Cloneable接口和clone方法*   clone方法不是Cloneable接口里的方法,Cloneable接口是个标记接口,空的。*   clone方法是object里的方法。

1997年克隆羊多利的出现,克隆这个概念就产生了,以羊为例子来写。

public class Sheep implements Cloneable{  //1997,克隆多利羊private String name;private Date birthday;@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone();return obj;}public Sheep(String name, Date birthday) {this.name = name;this.birthday = birthday;}public Sheep(){}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}

测试:

        Date d = new Date(314312432542L);Sheep sheep = new Sheep("少利", d);Sheep sheep2 = (Sheep) sheep.clone();sheep2.setName("多利");System.out.println(sheep);System.out.println(sheep.getName());System.out.println(sheep.getBirthday());System.out.println(sheep2);System.out.println(sheep2.getName());System.out.println(sheep2.getBirthday());

结果:

cn.oyh.GOF23.prototype.Sheep@1540e19d
少利
Tue Dec 18 05:00:32 CST 1979
cn.oyh.GOF23.prototype.Sheep@135fbaa4
多利
Tue Dec 18 05:00:32 CST 1979

但是这样是有问题的,把时间改一下,看下结果:

        Date d = new Date(314312432542L);Sheep sheep = new Sheep("少利", d);Sheep sheep2 = (Sheep) sheep.clone();sheep2.setName("多利");System.out.println(sheep);System.out.println(sheep.getBirthday());d.setTime(43254356246L);System.out.println(sheep.getName());System.out.println(sheep.getBirthday());System.out.println(sheep2);System.out.println(sheep2.getName());System.out.println(sheep2.getBirthday());
cn.oyh.GOF23.prototype.Sheep@1540e19d
Tue Dec 18 05:00:32 CST 1979
少利
Sun May 16 23:05:56 CST 1971
cn.oyh.GOF23.prototype.Sheep@135fbaa4
多利
Sun May 16 23:05:56 CST 1971

可以发现,sheep把时间改了,sheep2的时间也变了。这就是涉及到浅克隆和深克隆了。

 *浅克隆:sheep、sheep2都指向了同一个Date,如果sheep修改了时间,那么sheep2的时间也跟着变。* 深克隆:sheep2克隆出来的时候,也克隆了一个新的Date,两个sheep各自指着自己的Date。*    也就是对象下面的属性也进行拷贝。

要实现深克隆,只需在clone()方法里改:

  protected Object clone() throws CloneNotSupportedException {Object obj = super.clone();//  添加下面代码进行深克隆Sheep s = (Sheep) obj;s.birthday = (Date) this.birthday.clone();//把属性进行克隆return obj;}

再测试:

cn.oyh.GOF23.prototype.Sheep@1540e19d
Tue Dec 18 05:00:32 CST 1979
少利
Sun May 16 23:05:56 CST 1971
cn.oyh.GOF23.prototype.Sheep@135fbaa4
多利
Tue Dec 18 05:00:32 CST 1979

sheep2的时间没有改变。 也可以通过序列化和反序列化来实现深克隆,就是用IO流来写,我这就不写了。

原型模式,也叫克隆、拷贝模式,深克隆浅克隆相关推荐

  1. DOM克隆操作(深克隆/浅克隆)

    深克隆(克隆元素内文本节点加上所有后辈元素节点), 浅克隆(克隆元素本身,不克隆文本节点和后辈节点), 1. cloneNode()接受一个可选值为true或false的参数.True 表示克隆元素和 ...

  2. 创建型模式、结构型模式和行为型模式_设计模式之创建型模式

    设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...

  3. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  4. 02工厂模式+抽象工厂模式(创建型模式)

    • 工厂模式: – 实现了创建者和调用者的分离. – 详细分类: • 简单工厂模式:用来生产同一等级结构中的任意产品.(对于增加新的产品,需要修改已有代码,虽然某种程度不符合设计原则,但实际使用最多) ...

  5. Java设计模式——责任链模式(职责链模式)详解

    模式的定义与特点 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当 ...

  6. 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式

    前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...

  7. JAVA设计模式——工厂模式【简单工厂模式、工厂方法模式、抽象工厂模式】

    目录 简单工厂模式 传统方式 简单工厂模式 静态工厂模式 工厂方法模式 抽象工厂模式 工厂模式JDK-Calendar源码分析 工厂模式小结 简单工厂模式   看一个具体的需求 看一个披萨的项目:要便 ...

  8. 责任链模式(职责链模式)详解——小马同学@Tian

    责任链模式(职责链模式)详解 在现实生活中,一个事件需要经过多个对象处理是很常见的场景.例如,采购审批流程.请假流程等.公司员工请假,可批假的领导有部门负责人.副总经理.总经理等,但每个领导能批准的天 ...

  9. 责任链模式(职责链模式)详解

    在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假,可批假的领导有部门负责人.副总经理.总经理等,但每个领导能批准的天数不同,员工必须根 ...

  10. 原型模式 java 深浅_java学习笔记之原型模式及深浅拷贝

    一.原型模式的基本介绍 在聊原型模式之前,我们来思考一个小问题,传统的方式我们是如何克隆对象呢? 那我们以多利羊(Sheep)为例,来说明上述这个问题,具体代码见下面: 多利羊(Sheep) publ ...

最新文章

  1. R语言中使用pkgbuild::find_rtools查看是否有Rtools、使用Sys.which函数查看make是否存在、如果没有则安装、使用writeLines函数绑定R和Rtools
  2. linux网卡钩子,linux-Netfilter钩子注册与网络子系统
  3. 营销型网站建设需要注意哪些问题?
  4. 移动端web开发分享
  5. Qt paintevent事件
  6. Linux 初始root密码设置
  7. 从简单的一元线性回归分析入门机器学习
  8. SQL学习之使用视图
  9. 在Unity中为模型使用表情
  10. 7-1 自动售货机 (30 分)
  11. 原谅我,无法刻骨铭心地记住你
  12. Entry name 'kotlin/collections/MapWithDefault.kotlin_metadata' collided
  13. 测试四则运算2:Right-BICEP
  14. 详谈外部H5页面跳转微信一键关注微信公众号的方案
  15. am5728 中断的使用
  16. 咸鱼ZTMS实例—心率检测
  17. 【合辑】数字高程模型科普
  18. Kubespray安装kubernetes
  19. Codeforces 1034 A
  20. java(某人在玩游戏的时候输入密码112233后成功进入游戏(输错3次则被强行退出),要求用程序实现密码验证的过程。)

热门文章

  1. 【redis源码分析】Redis Sentinel 是如何实际解决分布式共识问题的
  2. Xilinx Zynq mpsoc 的 pcie Tandem 配置
  3. html单选按钮默认选中怎么做?input标签的单选按钮用法实例
  4. 导数——平均变化率与瞬时变化率
  5. 2021美赛E题题译+思路+参考资料
  6. 2023 计算机职业规划
  7. Java如何获取当前系统时间
  8. Word2vec原理+实战学习笔记(二)
  9. relative会脱离文档流吗_脱离文档流和恢复文档流的方法
  10. WIN7访问局域网内另外一台电脑的共享文件夹