原型模式,字面上的理解,以原型为标杆的模式。

原型模式其实就是从一个对象再创建另外一个可定制对象,而且不需知道任何创建的细节。

我们可以用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

Java里面一个比较典型的就是Cloneable接口,通过实现Cloneable接口,我们可以进行对象

的复制,这里当然就会讲到浅复制与深复制。

首先来看看原型模式的类图吧:

这里的Prototype是个基础的原型类,它实现了一个Cloneable的接口,也就是它能够把信息复制给另外一个类。

另外ConcretePrototype1和ConcretePrototype2继承自Prototype,因而也就有克隆功能,并且基于Prototype类

这个原型。

相关类图的代码就不贴了,这里主要给出Java中的深复制和浅复制的例子吧,便于理解。

PrototypeA类(用于浅复制):

package com.blog.anla.Prototype;

/**

* 原型类,声明一个克隆自身的接口 以浅复制为例

* @author U-ANLA

*

*/

public class PrototypeA implements Cloneable {

private int num1 = 0;

private int num2 = 0;

private People people;

public PrototypeA(){

people = new People();

}

@Override

protected Object clone() throws CloneNotSupportedException {

//并没有对people这个引用对象进行特殊处理

return (Object) super.clone();

}

public int getNum1() {

return num1;

}

public void setNum1(int num1) {

this.num1 = num1;

}

public int getNum2() {

return num2;

}

public void setNum2(int num2) {

this.num2 = num2;

}

public People getPeople() {

return people;

}

public void setPeople(People people) {

this.people = people;

}

@Override

public String toString() {

return "PrototypeA [num1=" + num1 + ", num2=" + num2 + ", people="

+ people + "]";

}

}

PrototypeB类(用于测试深复制):

package com.blog.anla.Prototype;

/**

* 原型模式,以深复制为例

* @author U-ANLA

*

*/

public class PrototypeB {

private int num1 = 0;

private int num2 = 0;

private People people;

public PrototypeB(){

people = new People();

}

@Override

protected PrototypeB clone() throws CloneNotSupportedException {

//新创建了一个对象并返回

PrototypeB pb = new PrototypeB();

pb.num1 = this.num1;

pb.num2 = this.num2;

pb.people = pb.people;

return (PrototypeB)pb;

}

public int getNum1() {

return num1;

}

public void setNum1(int num1) {

this.num1 = num1;

}

public int getNum2() {

return num2;

}

public void setNum2(int num2) {

this.num2 = num2;

}

public People getPeople() {

return people;

}

public void setPeople(People people) {

this.people = people;

}

@Override

public String toString() {

return "PrototypeB [num1=" + num1 + ", num2=" + num2 + ", people="

+ people + "]";

}

}

辅助类People:

package com.blog.anla.Prototype;

/**

* 模板类,用来测试并区分浅复制和深复制。

* @author U-ANLA

*

*/

public class People {

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "People [name=" + name + ", age=" + age + "]";

}

public People(String name, int age) {

super();

this.name = name;

this.age = age;

}

public People() {

}

}

测试类Main:

package com.blog.anla.Prototype;

/**

* 测试的深复制浅复制类,很明显,两个输出不同

* 浅复制只会复制基本类型,而对于引用类型,则是直接给指向的应用

* 而深复制除了可以复制基本类型外,还能够复制一套引用类型变量。

* @author U-ANLA

*

*/

public class Main {

public static void main(String[] args) throws CloneNotSupportedException {

//浅复制

PrototypeA pa = new PrototypeA();

pa.setNum1(5);

pa.setNum2(6);

pa.getPeople().setAge(25);

pa.getPeople().setName("Jack");

PrototypeA pa1 = (PrototypeA)pa.clone();

//修改pa1的值而不修改pa2的相关值。

pa1.getPeople().setAge(23);

pa1.setNum1(4);

//对比结果

System.out.println(pa);

System.out.println(pa1);

/**

* 输出结果:

* PrototypeA [num1=5, num2=6, people=People [name=Jack, age=23]]

* PrototypeA [num1=4, num2=6, people=People [name=Jack, age=23]]

*/

System.out.println();

System.out.println();

//深复制

PrototypeB pb = new PrototypeB();

pb.setNum1(5);

pb.setNum2(6);

pb.getPeople().setAge(25);

pb.getPeople().setName("Jack");

PrototypeB pa2 = (PrototypeB)pb.clone();

//修改pa1的值而不修改pa2的相关值。

pa2.getPeople().setAge(23);

pa2.getPeople().setName("Tom");

pa2.setNum1(4);

//对比结果

System.out.println(pb);

System.out.println(pa2);

/**

* 输出结果:

* PrototypeB [num1=5, num2=6, people=People [name=Jack, age=25]]

* PrototypeB [num1=4, num2=6, people=People [name=Tom, age=23]]

*/

}

} 赠人玫瑰手留余香,希望有助于理解原型模式以及浅复制和深复制(oo)

java自我复制_原型模式--自我复制(结合Java浅复制与深复制)相关推荐

  1. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  2. java 模板方法_设计模式(java实现)_模板方法模式(Template method)

    设计模式(java实现)_模板方法模式(Template method) 模板方法模式是编程中经常用到到的模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个 ...

  3. JAVA中浅复制与深复制

    來源:http://coolmist.javaeye.com/blog/127455 1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引 ...

  4. java引用复制_Java中引用的浅复制和深复制

    Java中除了基本类型int,char,double等的赋值是按照值传递之外,其余的类型和对象都是按照引用进行传递的. 下面来看一个关于引用的例子. package referenceCopy; // ...

  5. Java中Cloneable接口的浅复制与深复制

    Java中的深拷贝(深复制)和浅拷贝(浅复制) 深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽 ...

  6. java clone(浅复制和深复制)的前世今生

    之前只是听说clone,很高级的样子,一直没有用过,感觉日常开发好像用不到似的,谁知道这段时间的开发,发现clone非常好用,就专门学习了一下. 前世 先说说clone的由来吧,只知道它的用法,而不知 ...

  7. java prototype是什么,java设计模式-原型模式(Prototype)

    定义 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意 原型模式的结构 原型模式要求对象实现同一个可 ...

  8. java设计模式中—原型模式

    文章目录 原型介绍 实现 原型模式 原型中拷贝 浅拷贝 深拷贝 使用clone 方式 序列化方式 总结 原型介绍 举个栗子:大话西游里,孙悟空对战牛魔王,孙悟空拔了一个猴毛一吹,变出了一堆" ...

  9. java设计模式之原型模式和建造者模式的写法(二)

    背景 原型模式和建造者模式属于创建型模式,在开发中经常会用到,那么这两种设计模式是怎么写的呢,下面进行代码演示. 原型模式 原型模式的核心就是复制 package com.example.protot ...

最新文章

  1. 算法设计与分析第4章 动态规划(一)【背包问题】
  2. Stuts2的struts.devMode设置成true后,不起作用,仍需要重启tomcat
  3. java 并发包学习_Java学习笔记—多线程(java.util.concurrent并发包概括,转载)
  4. centos6安装配置
  5. 注意区分啊~这里求的的事公共子串不是子序列。NOJ308-Substring
  6. UDP协议抓包分析 -- wireshark
  7. java sha1_java使用SHA1加密算法详解
  8. 数据库访问优化法则详解之返回更少的数据
  9. teechart for java_TeeChart控件Java版
  10. 校园导航小助手—课程设计
  11. 【RNNoise】用深度学习抑制噪声
  12. android自定义url协议,Android平台设置UrlSchemes,实现被第三方应用调用
  13. python logging日志输出个文件中
  14. 773-780---DOM事件高级(常用鼠标事件,案例:跟随鼠标的天使,常用的键盘事件,案例:模拟京东按键输入内容,案例:模拟京东快递单号查询)
  15. Java 集合类(Map和Collection)
  16. 极2路由器刷Padavan(老毛子)固件并设置无线中继
  17. 电子围栏在化工厂定位系统中的应用,化工厂精确定位,减少损失-新导智能
  18. 关于 惠普 ENVY x360 15 bp10? 升级内存、硬盘 拆机 注意事项
  19. PHP curl请求处理
  20. AI换脸踩坑记录:Faceshifter

热门文章

  1. 邮件excel html,小数点分隔符在电子邮件(HTML/CSS)在Excel的VBA编程
  2. python pandas dataframe 转json_python将相类不同key的json对象转化为pandas的dataframe(上篇)...
  3. mysql limit耗时过长
  4. java使用阿里云oss上传文件测试案例+上传策略包装类
  5. Android复习11【service-音乐播放器、定时器、IntentService、ALDL使用】
  6. ANDROID 开发常用的框架、工具、API最全集合
  7. mac 上开发需要的软件
  8. Xcode7 UI自动化测试详解 带demo UITests
  9. AES前后端加密解密
  10. Java集合篇:ConcurrentHashMap详解(JDK1.8)