原型模式设计思想就是以一个对象为原型,然后对其复制,克隆,然后产生一个与原对象相似的对象。在java中,复制对象是通过集成Cloneable接口,复制对象是通过调用clone()方法来实现的。注意:该接口其实是一个标记型接口,内部是空的,clone方法是属于Object类的native方法,也就是本地调用。而复制又分为浅复制和深复制。看个例子来看深浅复制的区别:
原型类:
package cn.lh.designer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Prototype implements Cloneable,Serializable{
private String str;
private boolean a;
private CopyObject obj;
public Prototype() {
}
public Prototype(String str,boolean a) {
this.str = str;
this.a = a;
this.obj = new CopyObject();
}
private static final long serialVersionUID = 7977153787302907877L;
/**
* 浅复制
*/
@Override
public Object clone() throws CloneNotSupportedException {
Prototype pro = (Prototype) super.clone();
return pro;
}
/**
* 深复制
* @return
* @throws Exception
*/
public Object deepClone() throws Exception{
//写入当前对象的二进制流
ByteArrayOutputStream bao = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bao);
oos.writeObject(this);
//读出对象的二进制流
ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public CopyObject getObj() {
return obj;
}
public void setObj(CopyObject obj) {
this.obj = obj;
}
public boolean getA() {
return a;
}
public void setA(boolean a) {
this.a = a;
}
class CopyObject implements Serializable{
private static final long serialVersionUID = 1525222;
}
}
测试类:
package cn.lh.designer;
public class PrototypeTest {
public static void main(String[] args) throws Exception {
Prototype pro = new Prototype("你好",false);
Prototype pro1 = (Prototype) pro.clone();
Prototype pro2 = (Prototype) pro.deepClone();
System.out.println("基本数据类型:"+pro.getA()+";引用数据类型:"+pro.getObj());
System.out.println("基本数据类型:"+pro1.getA()+";引用数据类型:"+pro1.getObj());
System.out.println("基本数据类型:"+pro2.getA()+";引用数据类型:"+pro2.getObj());
}
}
输出结果:
基本数据类型:false;引用数据类型:cn.lh.designer.Prototype$CopyObject@42a57993
基本数据类型:false;引用数据类型:cn.lh.designer.Prototype$CopyObject@42a57993
基本数据类型:false;引用数据类型:cn.lh.designer.Prototype$CopyObject@4554617c
可以看出:不论深浅复制基本数据类型变量会被重新创建(未做考究),而浅复制引用类型变量复制出的对象指
向原对象的引用类型变量,深复制则是创建出一个新的引用类型变量。