抽象工厂模式就是:围绕一个超级工厂类,创建其他工厂类;再围绕工厂类,创建实体类。
相较于传统的工厂模式,它多出了一个超级工厂类。
它的优缺点与工厂模式类似,这里不再冗赘它的优缺点,下面直接谈一下实现吧。
为了让目标更清晰,就实现下面的示意图:
按照之前的做法,这里我们实现几个实体类:Cat 和 Dog 一组、Male 和 Female 一组。
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。
由于工厂类上面还有个超级工厂,为了方便工厂类生产实体,工厂类应该提供生产实体的方法接口。
为了更好的约束工厂类的实现,先实现一个抽象工厂类:
class AbstractFactory {getPerson() {throw new Error("子类请实现接口");}getAnimal() {throw new Error("子类请实现接口");}}
接下来,Animal 和 Dog 实现抽象工厂类(AbstractFactory):
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;}}}
超级工厂的实现没什么困难,如下所示:
class Factory {constructor(choice) {choice = choice.toLocaleLowerCase();switch (choice) {case "person":return new PersonFactory();case "animal":return new AnimalFactory();default:break;}}}
实现了那么多,还是要看用例才能更好理解“超级工厂”的用法和设计理念:
/*** 以下是测试代码*/// 创建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();