2019-04-01 | 设计模式手册 | UNLOCK

设计模式手册之抽象工厂模式

1. 什么是抽象工厂模式?

抽象工厂模式就是:围绕一个超级工厂类,创建其他工厂类;再围绕工厂类,创建实体类。

相较于传统的工厂模式,它多出了一个超级工厂类

它的优缺点与工厂模式类似,这里不再冗赘它的优缺点,下面直接谈一下实现吧。

2. 如何实现抽象工厂模式?

为了让目标更清晰,就实现下面的示意图:

image.png

准备实体类

按照之前的做法,这里我们实现几个实体类:Cat和Dog一组、Male和Female一组。

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
class Dog {
run() {
console.log('狗')
}
}

class Cat {
run() {
console.log('猫')
}
}

/*************************************************/

class Male {
run() {
console.log('男性')
}
}

class Female {
run() {
console.log('女性')
}
}

准备工厂类

假设Cat和Dog,属于Animal工厂的产品;Male和Female属于Person工厂的产品。所以需要实现2个工厂类:Animal和Person。

由于工厂类上面还有个超杰工厂,为了方便工厂类生产实体,工厂类应该提供生产实体的方法接口。

为了更好的约束工厂类的实现,先实现一个接口类:

1
2
3
4
5
6
7
8
9
class AbstractFactory {
getPerson() {
throw new Error('子类请实现接口')
}

getAnimal() {
throw new Error('子类请实现接口')
}
}

接下来,Animal和Dog继承这个接口类,实现对应方法即可:

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
class PersonFactory extends AbstractFactory{
getPerson(person) {
person = person.toLocaleLowerCase()
switch (person) {
case 'male':
return new Male()
case 'female':
return new Female()
default:
break;
}
}

getAnimal() {
return null
}
}

class AnimalFactory extends AbstractFactory{
getPerson() {
return null
}

getAnimal(animal) {
animal = animal.toLocaleLowerCase()
switch (animal) {
case 'cat':
return new Cat()
case 'dog':
return new Dog()
default:
break;
}
}
}

实现“超级工厂”

超级工厂的实现没什么困难,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Factory{
constructor(choice) {
choice = choice.toLocaleLowerCase()
switch (choice) {
case 'person':
return new PersonFactory()
case 'animal':
return new AnimalFactory()
default:
break;
}
}
}

看看怎么使用超级工厂

实现了那么多,还是要看用例才能更好理解“超级工厂”的用法和设计理念:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 以下是测试代码
*/

// 创建person工厂
const personFactory = new Factory('person')
// 从person工厂中创建 male 和 female 实体
const male = personFactory.getPerson('male'),
female = personFactory.getPerson('female')
// 输出测试
male.run()
female.run()

// 创建animal工厂
const animalFactory = new Factory('animal')
// 从animal工厂中创建 dog 和 cat 实体
const dog = animalFactory.getAnimal('dog'),
cat = animalFactory.getAnimal('cat')
// 输出测试
dog.run()
cat.run()

请针对 Disqus 开启代理