注册

设计模式-工厂方法模式

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


image-20211006145801692.png


其相比简单工厂模式,会多了一个工厂方法,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

0 个评论

要回复文章请先登录注册