原型模式
一、模式動(dòng)機(jī)
原型模式(Prototype Pattern)結(jié)構(gòu)較為簡單,它是一種特殊的創(chuàng)建型模式,當(dāng)需要?jiǎng)?chuàng)建大量相同或者相似對象時(shí),可以通過對一個(gè)已有對象的復(fù)制獲取更多對象。Java語言提供了較為簡單的原型模式解決方案,只需要?jiǎng)?chuàng)建一個(gè)原型對象,然后通過在類中定義的克隆方法復(fù)制自己。該模式應(yīng)用較為廣泛,可以快速生成大量的相似對象,極大提高了創(chuàng)建新實(shí)例的效率。
總結(jié)一下就是
- 復(fù)制一個(gè)對象,從而克隆出多個(gè)與原型對象一模一樣的對象
- 有些對象的創(chuàng)建過程較為復(fù)雜,而且需要頻繁創(chuàng)建
- 通過給出一個(gè)原型對象來指明所要?jiǎng)?chuàng)建的對象的類型,然后用復(fù)制這個(gè)原型對象的辦法創(chuàng)建出更多同類型的對象
二、模式定義
- 原型模式是一種對象創(chuàng)建型模式,用原型實(shí)例指定創(chuàng)建對象的種類,并且通過復(fù)制這些原型創(chuàng)建新的對象。
- 原型模式允許通過一個(gè)原型對象創(chuàng)建一個(gè)或多個(gè)同類型的其他對象,而無須知道任何創(chuàng)建的細(xì)節(jié)
工作原理
三、模式結(jié)構(gòu)
四、模式分析
- 淺克隆(Shallow Clone):當(dāng)原型對象被復(fù)制時(shí),只復(fù)制它本身和其中包含的值類型的成員變量,而引用類型的成員變量并沒有復(fù)制
- 深克隆(Deep Clone):除了對象本身被復(fù)制外,對象所包含的所有成員變量也將被復(fù)制
五、總結(jié)
模式優(yōu)點(diǎn)
- 簡化對象的創(chuàng)建過程,通過復(fù)制一個(gè)已有實(shí)例可以提高新實(shí)例的創(chuàng)建效率
- 擴(kuò)展性較好
- 簡化創(chuàng)建結(jié)構(gòu),原型模式中產(chǎn)品的復(fù)制是通過封裝在原型類中的克隆方法實(shí)現(xiàn)的,無須專門的工廠類來創(chuàng)建產(chǎn)品
- 可以使用深克隆的方式保存對象的狀態(tài),以便在需要的時(shí)候使用,可輔助實(shí)現(xiàn)撤銷操作
模式缺點(diǎn)
- 需要為每一個(gè)類配備一個(gè)克隆方法,而且該克隆方法位于一個(gè)類的內(nèi)部,當(dāng)對已有的類進(jìn)行改造時(shí),需要修改源代碼,違背了開閉原則。
- 在實(shí)現(xiàn)深克隆時(shí)需要編寫較為復(fù)雜的代碼,而且當(dāng)對象之間存在多重的嵌套引用時(shí),為了實(shí)現(xiàn)深克隆,每一層對象對應(yīng)的類都必須支持深克隆,實(shí)現(xiàn)起來可能會(huì)比較麻煩。
- 使用情形
- 創(chuàng)建新對象成本較大,新對象可以通過復(fù)制已有對象來獲得,如果是相似對象,則可以對其成員變量稍作修改
- 系統(tǒng)要保存對象的狀態(tài),而對象的狀態(tài)變化很小
- 需要避免使用分層次的工廠類來創(chuàng)建分層次的對象
擴(kuò)展
原型管理器(Prototype Manager)將多個(gè)原型對象存儲在一個(gè)集合中供客戶端使用,它是一個(gè)專門負(fù)責(zé)克隆對象的工廠,其中定義了一個(gè)集合用于存儲原型對象,如果需要某個(gè)原型對象的一個(gè)克隆,可以通過復(fù)制集合中對應(yīng)的原型對象來獲得。
原型管理器中針對抽象類型編程,以便擴(kuò)展。文章來源:http://www.zghlxwxcb.cn/news/detail-438283.html
原型管理器類文章來源地址http://www.zghlxwxcb.cn/news/detail-438283.html
public class PrototypeManager {
private Hashtable prototypeTable=new Hashtable(); //Hashtable存儲原型對象
public PrototypeManager() {
prototypeTable.put("A", new ConcretePrototypeA());
prototypeTable.put("B", new ConcretePrototypeB());
}
public void add(String key, Prototype prototype) {
prototypeTable.put(key,prototype);
}
public Prototype get(String key) {
Prototype clone = null;
clone = ((Prototype)prototypeTable.get(key)).clone(); //克隆方法創(chuàng)建新對象
return clone;
}
}
到了這里,關(guān)于原型模式(Prototype Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!