标签:
网上找了好多这个模型的资料说的都不透彻,看了半天都是云里雾里。只好自己操刀研究一把。
原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据.
原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
示例:
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 protype implements Cloneable,Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
public String name;
public fuck f;
public protype(String name){
this.name = name;
}
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
public Object deepClone(){
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream objout;
try {
objout = new ObjectOutputStream(out);
objout.writeObject(protype.this);
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream objin = new ObjectInputStream(in);
return objin.readObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
import java.io.Serializable; public class fuck implements Serializable { /** * */ private static final long serialVersionUID = -3616639877050139128L; String fname; public fuck(String name){ fname = name; } }
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub protype p1 = new protype("p1"); p1.f = new fuck("fuck1"); protype p2 = (protype) p1.clone(); p2.name = "p2"; p2.f.fname = "fuck2"; protype p3 = (protype)p1.deepClone(); p3.name = "p3"; p3.f.fname = "fuck3"; System.out.println("p1.name="+p1.name+" p2.name="+p2.name); System.out.println("f1.name="+p1.f.fname+" f2.name="+p2.f.fname); System.out.println("f1.name="+p1.f.fname+" f3.name="+p3.f.fname); } }
结果:
p1.name=p1 p2.name=p2
f1.name=fuck2 f2.name=fuck2
f1.name=fuck2 f3.name=fuck3
Java设计模式四: 原型模式(Prototype Pattern)
标签:
原文地址:http://www.cnblogs.com/dashu52/p/4313650.html