1. 什么是抽象工厂模式?
抽象工厂模式就是:围绕一个超级工厂类,创建其他工厂类;再围绕工厂类,创建实体类。
相较于传统的工厂模式,它多出了一个超级工厂类。
它的优缺点与工厂模式类似,这里不再冗赘它的优缺点,下面直接谈一下实现吧。
2. 如何实现抽象工厂模式?
为了让目标更清晰,就实现下面的示意图:

准备实体类
按照之前的做法,这里我们实现几个实体类: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 实现抽象工厂类(AbstractFactory):
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
|
const personFactory = new Factory('person')
const male = personFactory.getPerson('male'), female = personFactory.getPerson('female')
male.run() female.run()
const animalFactory = new Factory('animal')
const dog = animalFactory.getAnimal('dog'), cat = animalFactory.getAnimal('cat')
dog.run() cat.run()
|