1、模式標準
模式名稱:工廠方法模式
模式分類:創建型
模式意圖:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
結構圖:
適用于:
1、當一個類不知道它所必須創建的對象的類的時候
2、當一個類不希望由它的子類來指定它所創建的對象的時候
3、當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
2、分析與設計?
游戲中我們經常會創建一些單位對象,這些單位對象一般數量都比較大,比如士兵,地板,特效等等
而且這些單位都有一個特點,就是需要有一個“單位池”來進行回收再利用。在這個游戲框架中所有的單位都統稱為Item。管理這些的工廠叫ItemManager。比如生產單位:UnitItem,工廠為UnitItemManager,生產特效單位EffectItem,工廠為EffectItemManager
3、開始打造
import { IItem } from "./IItem";export interface IItemManager {createItem(itemNo: string): IItemremoveItem(item: IItem): void
}
?
export class UnitItemManager implements IItemManager {nextItemId = 0;generateUnitItemId(): number {return this.nextItemId++;}// 設計模式1(工廠方法)createItem(unitNo: string): UnitItem {let nodepool = xhgame.nodes.nodepools.get(unitNo);if (nodepool == null) {nodepool = new NodePool();xhgame.nodes.nodepools.set(unitNo, nodepool);}let node: Node;if (nodepool.size() == 0) {let prefab = resources.get(xhgame.prefab.UnitSpineItem, Prefab)node = instantiate(prefab);} else {node = nodepool.get()!;}let unitItem = node.getComponent(UnitItem);unitItem.unitNo = unitNounitItem.itemId = this.generateUnitItemId()return unitItem as UnitItem;}removeItem(unitItem: UnitItem<IUnitItemAttr>) {//壓入緩存池管理節點let nodepool = xhgame.nodes.nodepools.get(unitItem.unitNo);if (nodepool) {nodepool.put(unitItem.node);}unitItem.reset()unitItem.node.removeFromParent();}
}
?
export interface IItem {itemId: numberreset()
}
?
export class UnitItem extends Component implements IItem {itemId:number reset()
}
4、開始使用
let unitNo = 'shibing_001'
let unitItemManager = new UnitItemManager()
let unitItem = unitItemManager.createItem(unitNo)
unitItem.move()
unitItemManager.remove(unitItem)
類似的工廠方法模式還有?effectItemManager(特效工廠)goodsItemManager(物品工廠)tiledItemManager(地板工廠)