Skip to content

工厂方法模式(Factory Method)又称为多态性工厂模式,其核心不再像简单工厂模式那样负责所有的子类的创建,而是将具体的创建工作交给子类去完成 在前文已经介绍简单工厂模式 时,写了如下代码:

/**
 * type:角色类型 - 管理员、员工
 * name:对应角色的名字
 */
const Factory = (type, name) => {
  switch (type) {
    case "admin": // 创建管理员
      return new Admin(name, ["user", "salary", "vacation"]);
    case "staff": // 创建员工
      return new Staff(name, ["vacation"]);
    default: // 健壮性处理
      throw new Error("暂不支持该角色的创建");
  }
};

虽然其可以让我们在创建实例的时候很爽,不用关心内部具体的实现,通过观察代码,可以发现其存在的问题:

不符合设计原则-开放封闭原则

当每一次新增一个权限角色的时候,对需要对上面的代码进行修改,严重破坏了原有的代码和业务逻辑,与开放封闭原则背离

容易变成面条代码

虽然角色越来越多,那么内部的case也会随之变得越来越多,简单工厂函数的内容也随着变得冗余 理想情况下,我们是希望在新增新的权限角色时,对于老的代码无任何的修改便可以完成新功能的增加 首先看一下工厂方法模式的UML:

其相比简单工厂模式,会多了一个工厂方法,Admin类对应多了一个AdminFactory类,现在只需要通过AdminFactory类创建实例即可 接下来看看工厂方法模式如何创建:

class Person {
    constructor(name, permission) {
        this.name = name;
        this.permission = permission;
    }
}

/**
 * 管理员
 */
class Admin extends Person {
    constructor(name, permission) {
        super(name, permission);
    }
}

/**
 * 管理员的工厂方法
 */
class AdminFactory {
    static create(name) {
        return new Admin(name, ["user", "salary", "vacation"]);
    }
}

/**
 * 员工
 */
class Staff extends Person {
    constructor(name, permission) {
        super(name, permission);
    }
}

/**
 * 员工的工厂方法
 */
class StaffFactory {
    static create(name) {
        return new Staff(name, ["vacation"]);
    }
}

const admin = AdminFactory.create("管理员");
const zs = StaffFactory.create("张三");
const ls = StaffFactory.create("李四");

若是需要创建新的权限角色,只需要创建对应的工厂方法即可,完全符合开放封闭原则,也可以避免面条式代码,具体实例创建都是通过对应工厂方法创建

作者:Nordon 链接:https://juejin.cn/post/7016149646334492679 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Released under the MIT License.