原型设计模式是一个比较简单的设计模式,创建型模式的一种。主要作用是实现对象的自我复制。在实现上大多采用实现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;
}
/**
* 浅复制
*
* @return
* @throws CloneNotSupportedException
*/
@Override
public ProtoType clone() throws CloneNotSupportedException {
ProtoType protoType = (ProtoType) super.clone();
return protoType;
}
/**
* 深复制
* 深复制的实现也可以使用其他的方式,
* 比如:
* 1. 使用apache BeanUtils类中的copyproperties静态方法;
* 2. 自己反射实现。简单的对象自己实现性能上应该会好一些,复杂对象的话工作量会非常庞大,性能方面也未必有开源lib好。
* 3. ......
* 方法不只一种,根据自己的情况选择。
* @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();
}
}