设计模式-工厂方法模式
工厂方法模式(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