1、模式标准
模式名称:工厂方法模式
模式分类:创建型
模式意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
结构图:
适用于:
1、当一个类不知道它所必须创建的对象的类的时候
2、当一个类不希望由它的子类来指定它所创建的对象的时候
3、当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
2、分析与设计
游戏中我们经常会创建一些单位对象,这些单位对象一般数量都比较大,比如士兵,地板,特效等等
而且这些单位都有一个特点,就是需要有一个“单位池”来进行回收再利用。在这个游戏框架中所有的单位都统称为Item。管理这些的工厂叫ItemManager。比如生产单位:UnitItem,工厂为UnitItemManager,生产特效单位EffectItem,工厂为EffectItemManager
3、开始打造
import { IItem } from "./IItem";
export interface IItemManager {
createItem(itemNo: string): IItem
removeItem(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 = unitNo
unitItem.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: number
reset()
}
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(地板工厂)