1、模式标准

模式名称:工厂方法模式

模式分类:创建型

模式意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

结构图:

用23种设计模式打造一个cocos creator的游戏框架----(五)工厂方法模式-LMLPHP

适用于:

1、当一个类不知道它所必须创建的对象的类的时候

2、当一个类不希望由它的子类来指定它所创建的对象的时候

3、当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

2、分析与设计 

游戏中我们经常会创建一些单位对象,这些单位对象一般数量都比较大,比如士兵,地板,特效等等

而且这些单位都有一个特点,就是需要有一个“单位池”来进行回收再利用。在这个游戏框架中所有的单位都统称为Item。管理这些的工厂叫ItemManager。比如生产单位:UnitItem,工厂为UnitItemManager,生产特效单位EffectItem,工厂为EffectItemManager

3、开始打造

用23种设计模式打造一个cocos creator的游戏框架----(五)工厂方法模式-LMLPHP

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

12-09 22:00