Posted on 2007-12-02 16:16
flustar 閱讀(996)
評論(0) 編輯 收藏 所屬分類:
Design Patterns
Prototype模式的意圖是:
通過給出一個原型對象來指明所要創(chuàng)建的對象類型,然后用復制這個原型對象的辦法創(chuàng)建出更多的同類型對象。
在java的類庫中已經(jīng)實現(xiàn)了這一模式,只要你定義的類實現(xiàn)了Cloneable接口,用這個類所創(chuàng)建的對象可以做為原型對象進而克隆出更多的同類型的對象。下面舉個例子,來介紹簡單的介紹一下它的使用。
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("使用淺克隆方法進行創(chuàng)建對象");
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("使用深克隆方法進行創(chuàng)建對象");
System.out.println("============================");
pt1=(Prototype)pt.deepClone();
System.out.println(pt.getTemp());
System.out.println(pt1.getTemp());
}
}
輸出結果:
使用淺克隆方法進行創(chuàng)建對象
=============================
比較pt和pt1的str的值:
Hello World
Hello World
修改pt1對象中str的值后,比較pt和pt1的str的值:
Hello World
你好,世界
============================
比較pt和pt1中temp對象的值
Temp@affc70
Temp@affc70
使用深克隆方法進行創(chuàng)建對象
============================
Temp@affc70
Temp@15d56d5
從上面的輸出結果我們可以看出使用Object.clone()方法只能淺層次的克隆,即只能對那些成員變量是基本類型或String類型的對象進行克隆,對哪些成員變量是類類型的對象進行克隆要使用到對象的序列化,不然克隆克隆出來的Prototype對象都共享同一個temp實例。
小結:Prototype模式為我們提供另外一種高效創(chuàng)建對象的方法。使用Prototype模式,我們可以不了解原型對象的任何細節(jié)以及它內(nèi)部的層次的結構,快速克隆出一個個同樣的對象來,而且這些對象間無不影響,但是我們必須要實現(xiàn)它特定的接口。