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(地板工厂)