新聞中心
從相似的角度來(lái)說,它們兩個(gè)都通過Composite的方式,把實(shí)例化的過程從具體使用這些對(duì)象的類中分離出去,只讓用戶知道調(diào)用Manager或Factory的哪些方法來(lái)實(shí)例化而不用記住具體的類名。抽象工廠和原型模式是基于相同原理的模式,唯一的不同之處就是實(shí)例化的過程,抽象工廠是基于new來(lái)實(shí)例化對(duì)象的(缺點(diǎn)是HardCode,編譯時(shí)已經(jīng)決定了要實(shí)例化的具體是什么對(duì)象),而原型是基于Clone來(lái)創(chuàng)建對(duì)象的(優(yōu)點(diǎn)是在程序運(yùn)行時(shí),能夠像策略模式一樣實(shí)時(shí)更換對(duì)象,創(chuàng)建出基于相同接口的不同對(duì)象。)我更傾向的觀點(diǎn)把原型模式歸為抽象工廠的一種具體實(shí)現(xiàn)形式,強(qiáng)調(diào)實(shí)例的創(chuàng)建時(shí)是基于另一個(gè)實(shí)例的Clone方法。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)柳城,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108
上面說了原型模式這么多好處。下面將按照《HeadFirst設(shè)計(jì)模式》的例子的改版來(lái)做一下解說。
場(chǎng)景:
你接了某個(gè)游戲公司的項(xiàng)目,項(xiàng)目為設(shè)計(jì)一個(gè)角色扮演游戲。在游戲中,當(dāng)英雄在動(dòng)態(tài)創(chuàng)建的場(chǎng)景中闖蕩的時(shí)候,免不了要與各色各樣的怪物來(lái)戰(zhàn)斗。不僅有游戲公司預(yù)先定制好的怪物,而且還能夠讓高級(jí)玩家手動(dòng)創(chuàng)造新的怪物(預(yù)先定義好的怪物的特征幾乎都不一樣,行為比用戶自定義的怪物要多,用戶自定義的怪物只具備些簡(jiǎn)單行為,跟尾隨在身后的吉祥物差不多。對(duì)于自定義的怪物,玩家能夠選擇怪物的類型,例如是Dragon還是Bird,并且為其選擇顏色等)。Monster的設(shè)計(jì)如下:
凡是Monster都要實(shí)現(xiàn)IMonster的接口。DuckMonster和CakeMonster為游戲公司預(yù)設(shè)的怪物類,場(chǎng)景中每出現(xiàn)一只頭種怪物,都需要用到new DuckMonster或new CakeMonster。通過下面的兩個(gè)工廠之一來(lái)解耦其實(shí)例化的代碼。
而blueEyesWhiteDragon和bedEyesBlackBird為用戶定義的一種怪物(請(qǐng)注意!他們不是類,而是實(shí)例),場(chǎng)景中每出現(xiàn)一頭這種怪物,都需要調(diào)一次blueEyesWhiteDragon.Clone()或bedEyesBlackBird.Clone()。
先說一下MonsterFactory1與MonsterFactory2。
MonsterFactory1的缺點(diǎn):MonsterFactory1每當(dāng)增加一種新怪物的時(shí)候,就要增加一個(gè)GetXXMonter方法,等于不斷地對(duì)外開放接口,而且方法多起來(lái)難以管理。
或者說為DuckMonster和CakeMonster各自建一個(gè)Factory,好處是只需要一個(gè)Get方法。缺點(diǎn)自然是Factory太多,無(wú)法管理。
MonsterFactory2的缺點(diǎn)自然是每增加一種新怪物,就多一個(gè)if來(lái)根據(jù)type參數(shù)來(lái)取得實(shí)例,不符合面向?qū)ο笏枷氲摹皩?duì)擴(kuò)展開放,對(duì)修改關(guān)閉”的原則。
到了MonsterPrototypeManager,通過依賴注入(對(duì)于依賴注入不理解的可以看看我的另外兩篇文章:理解Spring中的依賴注入以及利用Spring解耦VS的WebService),我們可以不用寫任何初始化的代碼,來(lái)完成實(shí)例的創(chuàng)建,并且注入到regMonsterList這個(gè)Dictionary類的實(shí)例中。想獲得實(shí)例,只要把type傳進(jìn)去GetSpecificMonster,就能從regMonsterList中取得相應(yīng)的實(shí)例,并返回Clone后的實(shí)例。
在游戲過程中,高級(jí)玩家創(chuàng)建了一種新的怪物。由于這種怪物是一個(gè)實(shí)例,而不是一個(gè)類,所以還可以動(dòng)態(tài)添加到regMonsterList當(dāng)中,需要的時(shí)候可以拿出來(lái)Clone一下,來(lái)創(chuàng)建新實(shí)例。而MonsterFactory們就只能在編譯時(shí)期確定好具體定義好的怪物“類”,靈活性比Prototype模式的MonsterPrototypeManager要差。
分享標(biāo)題:淺談原型與抽象工廠
本文來(lái)源:http://m.5511xx.com/article/ccdgssd.html


咨詢
建站咨詢
