美文网首页
Typescript设计模式之工厂模式

Typescript设计模式之工厂模式

作者: 陌客百里 | 来源:发表于2020-08-20 23:44 被阅读0次

【序】express源码中使用到了工厂模式,恰好在公众号搜罗中看到了这篇TS的工厂模式文章,express中使用的是js的工厂模式,在ts中又有别样的用法,那么就学习并记录一下

问题一

  • 【疑惑】:什么是工厂模式?
  • 【解惑】: 工厂模式简单来说就是一个工厂(用于创建其它类的实例的类)多种产品(实际需要的类的实例),常见的又分为简单工厂模式(Simple Factory Pattern)工厂方法模式(Factory Method Pattern)

问题二

  • 【疑惑】:什么是简单工厂模式?
  • 【解惑】:既然是工厂,那么就从产品和工厂入手
  1. 产品类的抽象,此处使用了产品的抽象类,规定了产品的共性,便于后续定义产品
abstract class BMW {
  abstract run(): void;
}
  1. 定义具体产品类
class BMW730 extends BMW {
  run(): void {
    console.log("BMW730 发动咯");
  }
}
class BMW840 extends BMW {
  run(): void {
    console.log("BMW840 发动咯");
  }
}
  1. 定义工厂类,并将生产线定义为一个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();
  • 【优点】:
  1. 使用者不必关心对象是如何创建的
  2. 客户端只需要知道具体产品类所对应的参数即可
  • 【缺点】:
  1. 工厂类集中了所有逻辑,一旦工厂类不能正常工作就会影响整个系统
  2. 扩展困难,每次新增一种产品都需要对代码进行硬编码

问题三

  • 【疑惑】:什么是工厂方法模式?
  • 【解惑】:实际上就是有多条工厂线,各生产各的产品,只是多条工厂线具有相同的抽象工厂
  1. 定义产品
abstract class BMW {
  abstract run(): void;
}
class BMW730 extends BMW {
  run(): void {
    console.log("BMW730 发动咯");
  }
}
class BMW840 extends BMW {
  run(): void {
    console.log("BMW840 发动咯");
  }
}
  1. 定义生产线
interface BMWFactory {
  produceBMW(): BMW;
}
class BMW730Factory implements BMWFactory {
  produceBMW(): BMW {
    return new BMW730();
  }
}
class BMW840Factory implements BMWFactory {
  produceBMW(): BMW {
    return new BMW840();
  }
}
  1. 实际调用
const bmw730Factory = new BMW730Factory();
const bmw840Factory = new BMW840Factory();

const bmw730 = bmw730Factory.produceBMW();
const bmw840 = bmw840Factory.produceBMW();

bmw730.run();
bmw840.run();
  • 【缺点】:
  1. 增加产品就需要增加工厂,代码量变大
  • 【优点】:
  1. 增加产品时无需再修改原有的代码,维护性高
  2. 扩展性好
    【视野扩展】:extends 与 implements
    extends 主要用于继承一个类,如果继承的是实体类,这样该类就可以不用实现被继承的类的方法,如果继承的是抽象类,并且定义了抽象函数,那么必须要去实现抽象函数
    implements 则是用于实现一个定义好的接口(interface),如无可选项则必须实现,
    抽象类与接口之间的区别就是抽象类更偏向于创建共用的类,而接口只是一种规范
    【链接】抽象类与接口类的区别

总结

简单工厂模式的应用场景

  • 生产的产品比较少
  • 调用方只需要知道相关参数即可调用

工厂方法模式的应用场景

  • 较大的系统,较多的产品种类
  • 其实两种方法可以自由组合,当产品较多时,如果情况允许可以将产品做分类,然后和简单工厂配合使用

相关文章

网友评论

      本文标题:Typescript设计模式之工厂模式

      本文链接:https://www.haomeiwen.com/subject/plcyjktx.html