高端品牌車江蘇網(wǎng)站seo
1、模式標(biāo)準(zhǔn)
模式名稱:原型模式
模式分類:創(chuàng)建型
模式意圖:用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)復(fù)制這些原型創(chuàng)建新的對(duì)象
結(jié)構(gòu)圖:
適用于:
1、當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時(shí)
2、當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí),例如,通過(guò)動(dòng)態(tài)裝載
3、為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠類層次時(shí)。
4、當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們,可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。?
2、分析與設(shè)計(jì)
我們的unitItem經(jīng)過(guò)幾種模式的改造,已經(jīng)變得復(fù)雜起來(lái),通過(guò)cocos creator 中的instantiate可以克隆指定任何類型的對(duì)象,但是直接用有2個(gè)缺點(diǎn)不符合我們的設(shè)計(jì)。第一個(gè)是因?yàn)樵趗nitItem中我們用享元模式使用了fighter。如果直接用instantiate一個(gè)新對(duì)象是他擁有的是一個(gè)新fighter,并沒(méi)有共享內(nèi)存。第二個(gè)是因?yàn)槲覀兊挠螒蚩蚣芙o每個(gè)unitItem都設(shè)置了個(gè)unitId。所以我們還需要原型模式來(lái)通過(guò)這個(gè)clone操作來(lái)優(yōu)化上面2個(gè)問(wèn)題,當(dāng)然目前大部分工作也還是instantiate完成的。
另外目前抽象工廠方法 xhgame.itemFactory.createUnitItem('abc')創(chuàng)建的單位是一個(gè)原胚單位,一些屬性需要后期set。通過(guò)clone方法可以方便很多。
意圖:用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)復(fù)制(clone)創(chuàng)建新的對(duì)象
3、開始打造
item
export interface IItem {itemNo: stringreset(): voidclone(): any
}
單位的克隆
export class UnitItem extends Component implements IItem, IUnitItem {ad: number = 100;mp: number = 0;// 攻擊方式fighter: Fighter;private currentState: IUnitState = null;clone(): UnitItem<T> {// 克隆節(jié)點(diǎn)let cloneNode = instantiate(this.node);let clonedItem = cloneNode.getComponent(UnitItem)clonedItem.ad = this.ad;clonedItem.mp = this.mp;clonedItem.setFighter(xhgame.flyweightFactory.getFighter('jinchen_futou'))clonedItem.unitId = xhgame.itemFactory.getUnitItemId()return clonedItem;}.....}
4、開始使用
let unitItem = xhgame.itemFactory.createUnitItem('kuloubing')
unitItem.setFighter(xhgame.flyweightFactory.getFighter('jinchen_futou'));let unitItem2 = unitItem.clone()
console.log('是否內(nèi)存共享Fighter', unitItem.fighter === unitItem2.fighter) // 顯示true