您的位置:首页 > 编程语言 > Java开发

java设计模式----原型模式

2017-12-10 12:15 232 查看
原型模式设计思想就是以一个对象为原型,然后对其复制,克隆,然后产生一个与原对象相似的对象。在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


可以看出:不论深浅复制基本数据类型变量会被重新创建(未做考究),而浅复制引用类型变量复制出的对象指

向原对象的引用类型变量,深复制则是创建出一个新的引用类型变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: