前言
工厂,是创建产品的地方。在软件设计中的工厂模式,就是封装和管理对象的创建。工厂模式,具体划分的话,有简单工厂模式和工厂方法模式,根据抽象程度划分,有工厂方法模式和抽象工厂模式
简单工厂模式
简单理解,类和工厂一样,一件衣服的出厂其中包含了一系列的制作流程。某一类的创建过程也是经过一些列的流程,可以使用简单工厂模式。
场景:要new多个同一类型对象时可以考虑使用简单工厂
interface IClassFactory {
doDeal(): void;
}
class productA implements IClassFactory {
public constructor() {}
doDeal() {
console.log("deal A");
}
}
class productB implements IClassFactory {
public constructor() {}
doDeal() {
console.log("deal B");
}
}
class ClassFactory {
constructor() {}
public static dealOperate(type: string): IClassFactory {
switch (type) {
case "productA":
return new productA();
case "productB":
return new productB();
default:
throw new Error("undefine product");
}
}
}
工厂方法模式
理解
但是对于简单工厂模式,只能是针对某一对象创建一个工厂,若增加其他的对象只能是修改工厂类,违反了对扩展开放、对修改的关闭的原则,所以可以将工厂类抽象出一个基类,不同的产品继承基类,自己实现自己的子工厂。
abstract class Car {
abstract run():void;
}
class Car110 extends Car{
run() {
console.log('手动开启 car110 汽车');
}
}
class Car220 extends Car {
run() {
console.log('全自动开启 car220 汽车');
}
}
interface CarFactory {
productCar():Car;
}
class Car110Factory implements CarFactory {
productCar(): Car {
return new Car110();
}
}
class Car220Factory implements CarFactory {
productCar(): Car {
return new Car220();
}
}
(()=>{
const car110Factory = new Car110Factory();
const car220Factory = new Car110Factory();
const car110 =car110Factory.productCar();
const car220 =car220Factory.productCar();
car110.run();
car220.run();
})();
工厂方法模式不是简单工厂模式的升级,它们是2种不同的设计模式。可以从代码上分析,Car110和Car220开启方式方式不一致,使用简单工厂模式比较难做到,所以需要每个Car类封装自己的工厂,但是很明显如果另外一种Car的时候就需要再加一个工厂类和Car类
场景
当产品对象需要进行不同的加工时可以考虑工厂方法。
对比
- 简单工厂模式:生产的产品比较少,调用方只需要知道相关参数即可调用
- 工厂方法模式:较大的系统,较多的产品种类
其实两种模式可以自由组合,当产品较多时,如果情况允许可以将产品做分类,然后和简单工厂配合使用