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