原型模式(Prototype)html
该模式的思想就是将一个对象做为原型,对其进行复制、克隆,产生一个和原对象相似的新对象。java
说道复制对象,我将结合对象的浅复制和深复制来讲一下,首先须要了解对象深、浅复制的概念:测试
浅复制:将一个对象复制后,基本数据类型的变量都会从新建立,而引用类型,指向的仍是原对象所指向的。this
深复制:将一个对象复制后,不管是基本数据类型还有引用类型,都是从新建立的。简单来讲,就是深复制进行了彻底完全的复制,而浅复制不完全。prototype
写一个深浅复制的例子:code
package com.mode.create; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Prototype implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private int base; private Integer obj; /* 浅复制 */ public Object clone() throws CloneNotSupportedException { // 由于Cloneable接口是个空接口,你能够任意定义实现类的方法名 // 如cloneA或者cloneB,由于此处的重点是super.clone()这句话 // super.clone()调用的是Object的clone()方法 // 而在Object类中,clone()是native(本地方法)的 Prototype proto = (Prototype) super.clone(); return proto; } /* 深复制 */ public Object deepClone() throws IOException, ClassNotFoundException { /* 写入当前对象的二进制流 */ ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); /* 读出二进制流产生的新对象 */ ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } public int getBase() { return base; } public void setBase(int base) { this.base = base; } public Integer getObj() { return obj; } public void setObj(Integer obj) { this.obj = obj; } }
测试类:htm
package com.mode.create; import java.io.IOException; public class Test { public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, IOException { Prototype prototype = new Prototype(); prototype.setBase(1); prototype.setObj(new Integer(2)); /* 浅复制 */ Prototype prototype1 = (Prototype) prototype.clone(); /* 深复制 */ Prototype prototype2 = (Prototype) prototype.deepClone(); System.out.println(prototype1.getObj()==prototype1.getObj()); System.out.println(prototype1.getObj()==prototype2.getObj()); } }
运行结果:对象
参考资料接口
http://www.importnew.com/18390.htmlget