设计模式学习笔记(十一)—Prototype原型模式
Prototype模式的意图是:
通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。
在java的类库中已经实现了这一模式,只要你定义的类实现了Cloneable接口,用这个类所创建的对象可以做为原型对象进而克隆出更多的同类型的对象。下面举个例子,来介绍简单的介绍一下它的使用。
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;class Prototype implements Cloneable,Serializable{ private String str; private Temp temp; public Object clone()throws CloneNotSupportedException{ //浅克隆 Prototype prototype=(Prototype)super.clone(); return prototype; } public Object deepClone()throws IOException,ClassNotFoundException{ //深克隆 ByteArrayOutputStream bo=new ByteArrayOutputStream(); ObjectOutputStream oo=new ObjectOutputStream(bo); oo.writeObject(this); ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi=new ObjectInputStream(bi); return oi.readObject(); } public String getStr() { return str; } public void setStr(String str) { this.str = str; } public Temp getTemp() { return temp; } public void setTemp(Temp temp) { this.temp = temp; } }class Temp implements Serializable{ }public class Test { public static void main(String[] args)throws CloneNotSupportedException,ClassNotFoundException ,IOException{ Prototype pt=new Prototype(); Temp temp=new Temp(); pt.setTemp(temp); pt.setStr("Hello World"); System.out.println("使用浅克隆方法进行创建对象"); Prototype pt1=(Prototype)pt.clone(); System.out.println("============================="); System.out.println("比较pt和pt1的str的值:"); System.out.println(pt.getStr()); System.out.println(pt1.getStr()); System.out.println("修改pt1对象中str的值后,比较pt和pt1的str的值:"); pt1.setStr("你好,世界"); System.out.println(pt.getStr()); System.out.println(pt1.getStr()); System.out.println("============================"); System.out.println("比较pt和pt1中temp对象的值"); System.out.println(pt.getTemp()); System.out.println(pt1.getTemp()); System.out.println("使用深克隆方法进行创建对象"); System.out.println("============================"); pt1=(Prototype)pt.deepClone(); System.out.println(pt.getTemp()); System.out.println(pt1.getTemp()); }}
输出结果:
使用浅克隆方法进行创建对象
=============================
比较pt和pt1的str的值:
Hello World
Hello World
修改pt1对象中str的值后,比较pt和pt1的str的值:
Hello World
你好,世界
============================
比较pt和pt1中temp对象的值
Temp@affc70
Temp@affc70
使用深克隆方法进行创建对象
============================
Temp@affc70
Temp@15d56d5
从上面的输出结果我们可以看出使用Object.clone()方法只能浅层次的克隆,即只能对那些成员变量是基本类型或String类型的对象进行克隆,对哪些成员变量是类类型的对象进行克隆要使用到对象的序列化,不然克隆克隆出来的Prototype对象都共享同一个temp实例。
小结:Prototype模式为我们提供另外一种高效创建对象的方法。使用Prototype模式,我们可以不了解原型对象的任何细节以及它内部的层次的结构,快速克隆出一个个同样的对象来,而且这些对象间无不影响,但是我们必须要实现它特定的接口。