阅读 93

设计模式-工厂方法模式

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


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐