工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”
简单来说:就是把new
对象的操作包裹一层,对外提供一个可以根据不同参数创建不同对象的函数。
优点显而易见,可以隐藏原始类,方便之后的代码迁移。调用者只需要记住类的代名词即可。
由于多了层封装,会造成类的数目过多,系统复杂度增加。
调用者通过向工厂类传递参数,来获取对应的实体。在这个过程中,具体实体类的创建过程,由工厂类全权负责。
/*** 实体类:Dog、Cat*/class Dog {run() {console.log("狗");}}class Cat {run() {console.log("猫");}}/*** 工厂类:Animal*/class Animal {constructor(name) {name = name.toLocaleLowerCase();switch (name) {case "dog":return new Dog();case "cat":return new Cat();default:throw TypeError("class name wrong");}}}/*** 以下是测试代码*/const cat = new Animal("cat");cat.run();const dog = new Animal("dog");dog.run();