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

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

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

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

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

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

image.png

准备实体类

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

class Dog {
  run() {
    console.log("狗");
  }
}

class Cat {
  run() {
    console.log("猫");
  }
}

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

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

class Female {
  run() {
    console.log("女性");
  }
}
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

准备工厂类

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

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

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

class AbstractFactory {
  getPerson() {
    throw new Error("子类请实现接口");
  }

  getAnimal() {
    throw new Error("子类请实现接口");
  }
}
1
2
3
4
5
6
7
8
9

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

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
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

实现“超级工厂”

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

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

看看怎么使用超级工厂

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

/**
 * 以下是测试代码
 */

// 创建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();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21