一、Prototype模式的實現:
1、淺克?。?br />
a. 提供一個類作為克隆的原型,該類實現了Clonable接口
b. 在該類中覆蓋Object類的clone()方法,采用super.clone()方法完成克隆
c. 在外部使用場合先產生一個原型對象,然后調用其clone()方法產生克隆對象
2、深克?。?br />
a. 提供一個類作為克隆的原型,該類實現了Serializable接口
b. 在該類中覆蓋Object類的clone()方法,采用序列化的方法完成克隆(對象流的讀寫)
c.在外部使用場合先產生一個原型對象,然后調用其clone()方法產生克隆對象
二、Prototype模式與深、淺克隆:
使用Object.clone()方法進行的克隆是“淺克隆”-被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺復制僅僅復制所考慮的對象,而不復制它所引用的對象。淺克隆的步驟如下:
①為了獲取對象的一份拷貝,我們可以利用Object類的clone()方法。
②在派生類中覆蓋基類的clone()方法,并聲明為public。
③在派生類的clone()方法中,調用super.clone()。
④在派生類中實現Cloneable接口。
為什么我們在派生類中覆蓋Object的clone()方法時,一定要調用super.clone()呢?在運行時刻,Object中的clone()要識別出你要復制的是哪一個對象,然后為此對象分配空間,并進行對象的復制,將原始對象的內容一一復制到新對象的存儲空間中。
要實現“深克隆”-被復制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象。換言之,深復制把要復制的對象所引用的對象都復制了一遍。
深克隆需要使用Java中提供的對象串行化功能-即把要復制的對象寫入到一個緩沖流,然后通過輸入流讀入,完成對象的復制
例:
try {
// 在內存中開辟一塊緩沖區,用于將自身寫入
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
// 通過Serialization機制將自身寫入該緩沖區
out.writeObject(this);
out.close();
// 找到剛才開辟的緩沖區準備讀取
ByteArrayInputStream bin = new ByteArrayInputStream(bout
.toByteArray());
ObjectInputStream in = new ObjectInputStream(bin);
// 將剛才寫入的內容讀入一個新的對象
Object ret = in.readObject();
in.close();
// 返回這個對象,拷貝完畢
return ret;
} catch (Exception e) {
e.printStackTrace();
return null;
}
三、Prototype模式的優、缺點和適用場合:
使用Prototype模式的一個好處就是可以節省大量的接口實現類的編寫。采用工廠模式的話,如果分別為用戶指定的每種場合都提供一個用戶接口工廠類,將會為我們帶來繁重的工作量。未來避免用戶接口工廠類不斷增加,可以考慮使用Prototype模式。
而Prototype模式的一個致命的缺點是:Java中的原型方法不允許新對象擁有與父對象不同的方法。這時候,在使用原型方法之前,需要仔細考慮原型方法的利弊,甚至要試一下Prototype模式是否滿足需求。
綜上所述:Prototype模式最適用的場合應該是:當幾個對象的類僅在屬性上存在一點差異,而行為上完全相同時。可以在復制一個原型對象后,對其屬性進行細小的微調,從而實現定制化的目的。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2008-01-02 22:59
Paul Lin 閱讀(2039)
評論(0) 編輯 收藏 所屬分類:
模式與重構