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

1、模式标准

模式名称:抽象工厂模式

模式分类:创建型

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

结构图:

适用于:

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

2、分析与设计 

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

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

3、开始打造

 

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)

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 21:32:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 21:32:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 21:32:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 21:32:03       20 阅读

热门阅读

  1. KALI LINUX附录

    2023-12-07 21:32:03       28 阅读
  2. 华为eNSP AR2220路由器配置教程

    2023-12-07 21:32:03       56 阅读
  3. KALI LINUX安全审核

    2023-12-07 21:32:03       29 阅读
  4. 在Ubuntu上搭建RiscV交叉编译环境

    2023-12-07 21:32:03       241 阅读
  5. AISchedule(4):番茄钟功能

    2023-12-07 21:32:03       36 阅读
  6. .Net 字符集与编解码

    2023-12-07 21:32:03       29 阅读
  7. 聊聊springboot的logging.group

    2023-12-07 21:32:03       37 阅读
  8. C++基础 std::Move简说

    2023-12-07 21:32:03       45 阅读