Java设计模式四: 原型模式(Prototype Pattern)
网上找了好多这个模型的资料说的都不透彻,看了半天都是云里雾里。只好自己操刀研究一把。
原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据.
原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
示例:
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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。