文章

抽象工厂模式

抽象工厂模式

抽象工厂模式

概念

是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

如果说上面的简单工厂和工厂方法模式的工作是生产产品,那么抽象工厂模式的工作就是生产工厂的;

抽象工厂模式包含以下4种角色:

  • 抽象工厂
  • 具体工厂
  • 抽象产品
  • 具体产品

实例

而所谓抽象工厂模式,就是拥有多个抽象产品类(如卡车类 和 轮船类),并实现多个产品(如A品牌的卡车和A品牌轮船),同时拥有一个抽象工厂类(如我们的总公司),并提供2个抽象方法(生产卡车 和 生产轮船),每个具体工厂将会生产有多种产品(如A品牌工厂可以生产卡车和轮船)。

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// 唯一的抽象工厂类:我们的总公司,提供2个抽象方法,分别是createTruck 和 createShip
class Factory {
  createTruck() {}

  createShip() {}
}

// 具体工厂:A品牌工厂(能生产卡车和轮船)
class AFactory extends Factory {
  createTruck() {
    return new ATruck('卡车');
  }

  createShip() {
    return new AShip('轮船');
  }
}

// 具体工厂:B品牌工厂(能生产卡车和轮船)
class BFactory extends Factory {
  createTruck() {
    return new BTruck('卡车');
  }

  createShip() {
    return new BShip('轮船');
  }
}

// 第一个抽象产品类:卡车
class Truck {
  constructor(name) {
    this.name = name;
  }

  deliver() {}
}

// A品牌的卡车
class ATruck extends Truck {
  deliver() {
    console.log(`您要的 A 型号【${this.name}】生产好了`);
  }
}

// B品牌的卡车
class BTruck extends Truck {
  deliver() {
    console.log(`您要的 B 型号【${this.name}】生产好了`);
  }
}

// 第二个抽象产品类:轮船
class Ship {
  constructor(name) {
    this.name = name;
  }

  deliver() {}
}

// A品牌的轮船
class AShip extends Ship {
  deliver() {
    console.log(`您要的 A 型号【${this.name}】生产好了`);
  }
}

// B品牌的轮船
class BShip extends Ship {
  deliver() {
    console.log(`您要的 B 型号【${this.name}】生产好了`);
  }
}



// 需求者只需关心抽象工厂类(总公司),如选择 A品牌卡车
new AFactory().createTruck().deliver(); // 您要的 A 型号【卡车】生产好了

// 需求者只需关心抽象工厂类,如选择 B品牌轮船
new BFactory().createShip().deliver(); // 您要的 B 型号【轮船】生产好了

假设现在需要增加另一个C品牌的卡车和轮船,我们只需要做:

  1. 新增 C 品牌具体工厂类
1
2
3
4
5
6
7
8
9
class CFactory extends Factory {
  createTruck() {
    return new CTruck('卡车');
  }

  createShip() {
    return new CShip('轮船');
  }
}
  1. 新增 C 品牌具体产品类
1
2
3
4
5
6
7
8
9
10
11
class CTruck extends Truck {
  deliver() {
    console.log(`您要的 C 型号【${this.name}】生产好了`);
  }
}

class CShip extends Ship {
  deliver() {
    console.log(`您要的 C 型号【${this.name}】生产好了`);
  }
}
  1. 实例化
1
new CFactory().createTruck().deliver();

可以看到,和工厂方法一样,也不需要修改已有工厂类,只需要新增自己的具体工厂类和具体产品类就可以了,也符合“开闭原则”。

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