创建型模式-工厂

本文详细介绍了工厂模式在坦克创建案例中的应用,对比了简单工厂与抽象工厂的优缺点,特别探讨了在大型项目中选择抽象工厂的理由,以及如何在游戏开发中扩展对象创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单工厂和抽象工厂

前言:工厂模式解读
在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象,适用于较复杂对象的创建(比如:工程较大创建的对象种类较多的时候,更注重的是调用创建接口能够创建出整体产品)因为:工厂模式符合容易扩展减少原有代码修改以及结构清晰的思路;小项目有时候建议直接new来创建对象比较简单,因为工厂模式也存在一定的缺点。

以坦克创建为案例简述一下工厂模式的使用~
一、先对创建的产品的结构进行面向对象的类化,如下简单的代码用例:

//枚举出创建的坦克类型
enum Tank_Type {
    Tank_Type_56,
    Tank_Type_96
}

//共有的功能作为父类,或将父类做为抽象类abstract(开发中习惯吧,习惯使用继承)
class Tank {
    public hp: number = 0;
    public setHp(_hp: number) { this.hp = _hp; }
}

//具体类型的坦克
class Tank56 extends Tank {
    //特有的方法或属性
    public showType56_HP() {
        cc.log('showType56_HP', this.hp);
    }
}

//具体类型的坦克
class Tank96 extends Tank {
    //特有的方法或属性
    public showType96_HP() {
        cc.log('showType96_HP', this.hp)
    }
}

一、简单工厂
缺点:工厂类集中了所有产品类的创建逻辑,如果产品量较大,会使得工厂类变的非常臃肿,并且不适合产品种类相对较多的时候(比如:飞机、大炮等)从代码上也能轻松看出来~。

//简单工厂
class TankFactory {
    public createTank(type: Tank_Type) {
        switch (type) {
            case Tank_Type.Tank_Type_56:
                return new Tank56();
            case Tank_Type.Tank_Type_96:
                return new Tank96();
        }
    }
}

//使用工厂进行创建建
   let factory: TankFactory = new TankFactory();
   let tank56: Tank56 = factory.createTank(Tank_Type.Tank_Type_56) as Tank56;
   tank56.setHp(56);
   tank56.showType56_HP();

   let tank96: Tank96 = factory.createTank(Tank_Type.Tank_Type_96) as Tank96;
   tank96.setHp(96);
   tank96.showType96_HP();

二、抽象工厂
缺点:产品类数据较多时,需要实现大量的工厂类,这无疑增加了代码量。但是相对第一种我更喜欢第二种用法因为扩展起来确实方便。

//抽象化工厂
abstract class TankFactory {
    public abstract createTank(): any;
}

class Tank56Factory extends TankFactory{
    public createTank() {
        return new Tank56();
    }

}

class Tank96Factory extends TankFactory{
    public createTank() {
        return new Tank96();
    }
}

//使用工厂进行创建
//当new失败的时候,这样是不是更合适一些
try {
    let tank56: Tank56 = new Tank56Factory().createTank();
    tank56.setHp(56);
    tank56.showType56_HP();

    let tank96: Tank96 = new Tank96Factory().createTank();
    tank96.setHp(96);
    tank96.showType96_HP();
}
catch (error) {
    cc.error("ERR-------------->>>>", error)
}

不知道看到这里是习惯第一种还是第二种呢?
在举个例子:一款游戏中我们要创建的对象包括:
1->敌人<不同类型的>
2->boss<不同类型的>
3->障碍物<不同类型的>
4->陷阱<不同类型的>
5->子弹<不同类型的>
等各种类。我比较习惯用第一种方式按照第二种写法去创建我们需要的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值