简单工厂和抽象工厂
前言:工厂模式解读
在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象,适用于较复杂对象的创建(比如:工程较大创建的对象种类较多的时候,更注重的是调用创建接口能够创建出整体产品)因为:工厂模式符合容易扩展减少原有代码修改以及结构清晰的思路;小项目有时候建议直接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->子弹<不同类型的>
等各种类。我比较习惯用第一种方式按照第二种写法去创建我们需要的对象。