1、模式标准

模式名称:抽象工厂模式

模式分类:创建型

模式意图:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

结构图:

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

适用于:

1、一个系统要独立于它的产品的创建、组合和表示时。
2、一个系统要由多个产品系列中的一个来配置时。
3、当要强调一系列相关的产品对象的设计以便进行联合使用时。
4、当提供一个产品类库,只想显示它们的接口而不是实现时。 

2、分析与设计 

每个游戏里都有的单位、特效、地板等,且游戏分为2D单位和3D单位,如果不做整合,每次都得记住去一些方法名。我们希望的是通过类似xhgame.itemFactory.createUnitItem(),xhgame.itemFactory.createEffectItem()这种方法来创建单位而不需要知道具体创建的是2D单位还是3D单位以及由哪个工厂创建

意图:提供一个接口,用于创建相关或依赖对象的家族(每个游戏里都有的单位、特效、地板等),而不需要明确指定具体类(具体是2D单位还是3D单位)。

3、开始打造

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

 

export interface IFactory {
    createUnitItem(unitNo: string)
    createEffectItem(path: string)
}
export class ItemFactory  implements IFactory {

    /** items对象管理 */
    private unitItemManager: UnitItemManager<T>
    private tipsItemManager: TipsItemManager
    private effectItemManager: EffectItemManager
    private goodsItemManager: GoodsItemManager
    private tiledItemManager: TiledItemManager

    constructor() {
        this.unitItemManager = new UnitItemManager()
        this.tipsItemManager = new TipsItemManager()
        this.effectItemManager = new EffectItemManager()
        this.goodsItemManager = new GoodsItemManager()
        this.tiledItemManager = new TiledItemManager()
    }

    createUnitItem(unitNo: string, unitType: UnitType | string, unitName: string = '') {
        return this.unitItemManager.createItem(unitNo, unitType, unitName)
    }
    removeUnitItem(unitItem: UnitItem<IUnitItemAttr>) {
        return this.unitItemManager.removeItem(unitItem)
    }

    // 特效
    createEffectItem(_path: string) {
        return this.effectItemManager.createItem(_path)
    }

    removeEffectItem(effectItem: EffectItem) {
        return this.effectItemManager.removeItem(effectItem)
    }


    // 物品
    createGoodsItem(goodsNo: string) {
        return this.goodsItemManager.createItem(goodsNo)
    }
    removeGoodsItem(goodsItem: GoodsItem) {
        return this.goodsItemManager.removeItem(goodsItem)
    }

    // 地板
    createTiledItem(tiledNo: string) {
        return this.tiledItemManager.createItem(tiledNo)
    }
    removeTiledItem(tiledItem: TiledItem) {
        return this.tiledItemManager.removeItem(tiledItem)
    }

}
export interface IUnitItem {
    hp: number
}

export interface IEffectItem {
    maxDuration: number // 最大播放时间
}
export class UnitItem  extends Component implements IItem, IUnitItem {

    hp:number = 0
    reset(){
        this.hp = 0
    }
}
export class EffectItem extends Component implements IItem, IEffectItem {

    /** 动画最大播放时间 */
    maxDuration: number = 0;

    reset() {

    }
}

当前游戏框架使用的2D模式,暂时没处理3D

 4、开始使用

let unitNo = 'shibing_001' 
let unitItem = xhgame.itemFactory.createUnitItem(unitNo)

let effectNo = 'texiao_001'
let effectItem = xhgame.itemFactory.createEffectItem(effectNo)
12-07 22:21