【序】express源码中使用到了工厂模式,恰好在公众号搜罗中看到了这篇TS的工厂模式文章,express中使用的是js的工厂模式,在ts中又有别样的用法,那么就学习并记录一下
问题一
- 【疑惑】:什么是工厂模式?
- 【解惑】: 工厂模式简单来说就是一个工厂(用于创建其它类的实例的类),多种产品(实际需要的类的实例),常见的又分为简单工厂模式(Simple Factory Pattern)与工厂方法模式(Factory Method Pattern)
问题二
- 【疑惑】:什么是简单工厂模式?
- 【解惑】:既然是工厂,那么就从产品和工厂入手
- 产品类的抽象,此处使用了产品的抽象类,规定了产品的共性,便于后续定义产品
abstract class BMW {
abstract run(): void;
}
- 定义具体产品类
class BMW730 extends BMW {
run(): void {
console.log("BMW730 发动咯");
}
}
class BMW840 extends BMW {
run(): void {
console.log("BMW840 发动咯");
}
}
- 定义工厂类,并将生产线定义为一个static静态方法,可以在使用时不需要new一个工厂
class BMWFactory {
public static produceBMW(model: "730" | "840"): BMW {
if (model === "730") {
return new BMW730();
} else {
return new BMW840();
}
}
}
const bmw730 = BMWFactory.produceBMW("730");
const bmw840 = BMWFactory.produceBMW("840");
bmw730.run();
bmw840.run();
- 【优点】:
- 使用者不必关心对象是如何创建的
- 客户端只需要知道具体产品类所对应的参数即可
- 【缺点】:
- 工厂类集中了所有逻辑,一旦工厂类不能正常工作就会影响整个系统
- 扩展困难,每次新增一种产品都需要对代码进行硬编码
问题三
- 【疑惑】:什么是工厂方法模式?
- 【解惑】:实际上就是有多条工厂线,各生产各的产品,只是多条工厂线具有相同的抽象工厂
- 定义产品
abstract class BMW {
abstract run(): void;
}
class BMW730 extends BMW {
run(): void {
console.log("BMW730 发动咯");
}
}
class BMW840 extends BMW {
run(): void {
console.log("BMW840 发动咯");
}
}
- 定义生产线
interface BMWFactory {
produceBMW(): BMW;
}
class BMW730Factory implements BMWFactory {
produceBMW(): BMW {
return new BMW730();
}
}
class BMW840Factory implements BMWFactory {
produceBMW(): BMW {
return new BMW840();
}
}
- 实际调用
const bmw730Factory = new BMW730Factory();
const bmw840Factory = new BMW840Factory();
const bmw730 = bmw730Factory.produceBMW();
const bmw840 = bmw840Factory.produceBMW();
bmw730.run();
bmw840.run();
- 【缺点】:
- 增加产品就需要增加工厂,代码量变大
- 【优点】:
- 增加产品时无需再修改原有的代码,维护性高
- 扩展性好
【视野扩展】:extends 与 implements
extends 主要用于继承一个类,如果继承的是实体类,这样该类就可以不用实现被继承的类的方法,如果继承的是抽象类,并且定义了抽象函数,那么必须要去实现抽象函数
implements 则是用于实现一个定义好的接口(interface),如无可选项则必须实现,
抽象类与接口之间的区别就是抽象类更偏向于创建共用的类,而接口只是一种规范
【链接】抽象类与接口类的区别
总结
简单工厂模式的应用场景
- 生产的产品比较少
- 调用方只需要知道相关参数即可调用
工厂方法模式的应用场景
- 较大的系统,较多的产品种类
- 其实两种方法可以自由组合,当产品较多时,如果情况允许可以将产品做分类,然后和简单工厂配合使用
网友评论