原型设计模式是一个比较简单的设计模式,创建型模式的一种。主要作用是实现对象的自我复制。在实现上大多采用实现JDK中的Cloneable接口。适用场景同它的作用,也就是需要进行对象拷贝的情况。
在属性拷贝过程中,本例子实现了两种方式:浅复制和深复制。代码如下:
package com.array7.prototype; import java.io.*; /** * 调用 */ public class Run { public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException { // 构造一个带引用的对象 ProtoType p1 = new ProtoType(new Pojo("array7", 27)); // 浅层复制,只复制引用 ProtoType p2 = p1.clone(); // 深层复制,创建一个完全一样的对象。包含子对象。 ProtoType p3 = p1.deepClone(); // 修改名称 p1.getPojo().setName("Jackson"); System.out.println(p2.getPojo().getName()); // result is Jasckson System.out.println(p3.getPojo().getName()); // result is array7 } } /** * 如果要使用流的方式一定需要实现序列化接口 */ class Pojo implements Serializable { private String name; private int age; public Pojo(String name, int age) { this.name = name; this.age = 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; } } /** * 如果要使用流的方式一定需要实现序列化接口 */ class ProtoType implements Cloneable, Serializable { private Pojo pojo; public ProtoType(Pojo pojo) { this.pojo = pojo; } public Pojo getPojo() { return pojo; } public void setPojo(Pojo pojo) { this.pojo = pojo; } /** * 浅复制 * 使用apache BeanUtils类中的copyproperties静态方法也可以实现 * @return * @throws CloneNotSupportedException */ @Override public ProtoType clone() throws CloneNotSupportedException { ProtoType protoType = (ProtoType) super.clone(); return protoType; } /** * 深复制 * 深复制的实现也可以使用其他的方式,比如: * 自己反射实现。简单的对象自己实现性能上应该会好一些,复杂对象的话工作量会非常庞大,性能方面也未必有开源lib好。 * @return * @throws IOException * @throws ClassNotFoundException */ public ProtoType deepClone() throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); new ObjectOutputStream(bos).writeObject(this); return (ProtoType) new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())).readObject(); } }