文章

工厂方法模式

工厂方法模式

工厂方法模式

工厂方法模式是简单工厂的进一步优化,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂,也就是说每个对象都有一个与之对应的工厂。

概念

工厂方法模式是由父类提供创建对象的方法,子类来决定实例化对象的类型。

实例

继续上面简单工厂做修改

先定义一个产品父类 Product,提供一个方法 deliver

1
2
3
4
5
6
7
class Product {
  constructor(name) {
    this.name = name;
  }

  deliver() {};
}

卡车 和 轮船 (产品子类)都继承自产品父类 Product,并重写方法 deliver

1
2
3
4
5
6
7
8
9
10
11
12
13
// 产品子类 - 卡车
class Truck extends Product {
  deliver() {
    console.log(`您要的【${this.name}】生产好了`);
  };
}

// 产品子类 - 轮船
class Ship extends Product {
  deliver() {
    console.log(`您要的【${this.name}】生产好了`);
  };
}

添加一个工厂父类,提供一个创建对象的接口 create

1
2
3
4
// 工厂父类
class Factory {
  create() {}
}

卡车和轮船都提供一个工厂子类(子类来决定实例化对象的类型):

1
2
3
4
5
6
7
8
9
10
11
12
13
// 工厂子类 - 卡车子类
class TruckFactory extends Factory {
  create() {
    return new Truck('卡车');
  }
}

// 工厂子类 - 轮船子类
class ShipFactory extends Factory {
  create() {
    return new Ship('轮船');
  }
}

根据需求方生产对应产品:

1
2
3
4
5
// 需求方要生产 卡车
new TruckFactory().create().deliver(); // 您要的【卡车】生产好了

// 需求方要生产 轮船
new ShipFactory().create().deliver(); // 您要的【轮船】生产好了

这时业务扩展,需要新增生产飞机,只需要新增一种产品的子类和工厂的子类即可(无需修改工厂基类):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 飞机子类
class Plane extends Product {
  deliver() {
    console.log(`您要的【${this.name}】生产好了`);
  };
}

// 飞机工厂子类
class PlaneFactory extends Factory {
  create() {
    return new Plane('飞机');
  }
}

// 需求方要生产 飞机
new PlaneFactory().create().deliver(); // 您要的【飞机】生产好了

完全不用修改工厂基类 Factory,只需要扩展实现自己需要的就可以了,不会影响已有代码。这就是对扩展开放,对修改封闭(开闭原则)

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// 产品基类
class Product {
  constructor(name) {
    this.name = name;
  }

  deliver() {};
}

// 产品子类 - 卡车
class Truck extends Product {
  deliver() {
    console.log(`您要的【${this.name}】生产好了`);
  };
}

// 产品子类 - 轮船
class Ship extends Product {
  deliver() {
    console.log(`您要的【${this.name}】生产好了`);
  };
}

// 工厂基类
class Factory {
  create() {}
}

// 子工厂 - 卡车
class TruckFactory extends Factory {
  create() {
    return new Truck('卡车');
  }
}

// 子工厂 - 轮船
class ShipFactory extends Factory {
  create() {
    return new Ship('轮船');
  }
}

// 需求方要生产 卡车
new TruckFactory().create().deliver(); // 您要的【卡车】生产好了

// 需求方要生产 轮船
new ShipFactory().create().deliver(); // 您要的【轮船】生产好了


//这时业务扩展,需要新增飞机,只需要新增一种产品的子类和一种工厂的子类即可:

// 飞机子类
class Plane extends Product {
  deliver() {
    console.log(`您要的【${this.name}】生产好了`);
  };
}

// 飞机工厂子类
class PlaneFactory extends Factory {
  create() {
    return new Plane('飞机');
  }
}

// 需求方要生产 飞机
new PlaneFactory().create().deliver(); // 您要的【飞机】生产好了

又由于业务需要,需要加入不同品牌的卡车和轮船,工厂方法模式已经无法满足需求了,这时抽象工厂模式适时的出现。

本文由作者按照 CC BY 4.0 进行授权