用23种设计模式打造一个cocos creator的游戏框架----(六)抽象工厂模式
2023-12-13 04:31:47
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)
文章来源:https://blog.csdn.net/u010192444/article/details/134804882
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!