简单工厂

类图

Snipaste_2020-09-13_20-51-34.png

代码演示

  1. // 简单工厂模式
  2. abstract class BMW {
  3. constructor(public name: string) {}
  4. }
  5. class BMWX3 extends BMW {}
  6. class BMWX5 extends BMW {}
  7. class BMWQ7 extends BMW {}
  8. class BMWFactory {
  9. static order(name: string) {
  10. switch (name) {
  11. case "BMWX3":
  12. return new BMWX3("new bmw x3");
  13. case "BMWX5":
  14. return new BMWX5("new bmw x5");
  15. case "BMWQ7":
  16. return new BMWQ7("new bmw Q7");
  17. default:
  18. throw new Error("no store");
  19. }
  20. }
  21. }
  22. console.log(BMWFactory.order("BMWX3"));
  23. console.log(BMWFactory.order("BMWX5"));
  24. console.log(BMWFactory.order("BMWQ7"));

只有一个工厂,传入不同的名称创建不同的类。
使用简单

工厂方法

定义

  • 在工厂方法模式中,Factory Method,又称作多态性工厂模式
  • 在工厂方法模式中,核心的工厂类不赋值所有产品的创建,而是将具体的创建工作交给工厂子类。

    类图

    Snipaste_2020-09-13_20-51-34.png

    代码示例

    ```javascript abstract class BMW { constructor(public name: string) {} } class BMWX3 extends BMW {} class BMWX5 extends BMW {} class BMWQ7 extends BMW {}

abstract class BMWFactory { abstract createBMW(): BMW; } class BMWX3Factory extends BMWFactory { createBMW() { return new BMWX3(“宝马X3”); } } class BMWX5Factory extends BMWFactory { createBMW() { return new BMWX5(“宝马X5”); } } class BMWQ7Factory extends BMWFactory { createBMW() { return new BMWQ7(“宝马Q7”); } } // 简单工厂,是在工厂里面直接创建产品 // 工厂方法,是在工厂里面分派任务给子工厂 class Factory { static order(name: string) { switch (name) { case “BMWX3”: return new BMWX3Factory().createBMW(); case “BMWX5”: return new BMWX5Factory().createBMW(); case “BMWQ7”: return new BMWQ7Factory().createBMW(); default: throw new Error(“no store”); } } } let bmw3Factory = new BMWX3Factory(); let bmw5Factory = new BMWX5Factory(); let bmw7Factory = new BMWQ7Factory(); console.log(bmw3Factory.createBMW()); console.log(bmw5Factory.createBMW()); console.log(bmw7Factory.createBMW());

console.log(Factory.order(“BMWX3”)); console.log(Factory.order(“BMWX5”)); console.log(Factory.order(“BMWQ7”));

  1. <a name="sYPIX"></a>
  2. ## 抽象工厂
  3. <a name="frLTP"></a>
  4. ### 定义
  5. - 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况,创建多个产品族的产品对象
  6. - 抽象工厂模式针对的是多种类的产品设计
  7. - 系统中有多个产品族,每个具体工厂负责创建同一族但属于不同产品等级的产品
  8. <a name="si697"></a>
  9. #### 组成角色
  10. - 抽象工厂:提供创建产品的接口,包含多个创建产品的方法
  11. - 具体工厂:实现抽象工厂定义的接口,完成某个具体产品的创建
  12. - 抽象产品:有多少抽象产品,抽象工厂中就包含多少个创建产品的方法
  13. - 具体产品:抽象产品的实现类
  14. <a name="xZJsA"></a>
  15. ### 类图
  16. ![Snipaste_2020-09-13_20-51-34.png](https://cdn.nlark.com/yuque/0/2020/png/737887/1600007009572-1d47e304-c50f-4f7a-9133-858b0d9de600.png#align=left&display=inline&height=438&margin=%5Bobject%20Object%5D&name=Snipaste_2020-09-13_20-51-34.png&originHeight=438&originWidth=624&size=5983&status=done&style=none&width=624)
  17. <a name="2Uwua"></a>
  18. ### 代码示例
  19. ```javascript
  20. // 抽象的产品
  21. abstract class Car {
  22. constructor(public name: string) {}
  23. }
  24. abstract class Suv {
  25. constructor(public name: string) {}
  26. }
  27. // 具体的产品
  28. class BMWCar extends Car {}
  29. class BMWSuv extends Suv {}
  30. class BYDCar extends Car {}
  31. class BYDSuv extends Suv {}
  32. // 抽象工厂,抽象工厂里需要抽象方法
  33. abstract class MachineFactory {
  34. abstract createCar(): Car;
  35. abstract createSuv(): Suv;
  36. }
  37. // 具体的工厂
  38. class BMWFactory extends MachineFactory {
  39. createCar() {
  40. return new BMWCar("这是bmw的car");
  41. }
  42. createSuv() {
  43. return new BMWSuv("这是bmw的suv");
  44. }
  45. }
  46. class BYDFactory extends MachineFactory {
  47. createCar() {
  48. return new BYDCar("这是byd的car");
  49. }
  50. createSuv() {
  51. return new BYDSuv("这是byd的SUV");
  52. }
  53. }
  54. let bmwFactory = new BMWFactory();
  55. console.log(bmwFactory.createCar());
  56. console.log(bmwFactory.createSuv());
  57. let bydFactory = new BYDFactory();
  58. console.log(bydFactory.createCar());
  59. console.log(bydFactory.createSuv());