Typescript设计模式之工厂模式

2020-08-20  本文已影响0人  陌客百里

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

问题一


问题二

  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),如无可选项则必须实现,
    抽象类与接口之间的区别就是抽象类更偏向于创建共用的类,而接口只是一种规范
    【链接】抽象类与接口类的区别

总结

简单工厂模式的应用场景

工厂方法模式的应用场景

上一篇 下一篇

猜你喜欢

热点阅读