设计模式-工厂模式
现在需要开发一个系统,里面存在不同的角色,最常见的就是管理员、员工的角色,然后需要根据不同的角色分发不同的权限
拿到需求之后立马撸代码:
class Person { constructor(name, permission) { this.name = name; this.permission = permission; } } /** * 管理员 */ class Admin extends Person { constructor(name, permission) { super(name, permission); } } /** * 员工 */ class Staff extends Person { constructor(name, permission) { super(name, permission); } } 复制代码
管理员和员工应存在其他差异,上述代码为了便于理解,没有着重体现细节差异
创建好基类之后,接下来便根据角色使用new关键字直接实例化子类,便可以很开心的将功能开发完成
const admin = new Admin('管理员', ['user', 'salary', 'vacation']); const zs = new Staff('张三', ['vacation']); const ls = new Staff('李四', ['vacation']); 复制代码
通过观察上述代码,存在一些问题:
代码之间的耦合性比较强、依赖具体类的实现
当我想要具体创建某个类的时候,需要关注到具体的类,比如当我创建一个管理员权限的角色,需要直接new Admin来创建,和类的耦合性太强
代码较为冗余
当我需要创建一个员工角色时,传递给Staff的参数都是不变的,变得是name,会产生大量的重复的代码
不利于扩展、维护
随着业务迭代,不论是新增权限还是修改不同角色的权限都将是一个令人头疼的事情
简单工厂模式可以很好的解决上述问题:
/** * 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("暂不支持改角色的创建"); } }; console.log(Factory("admin", "管理员")); console.log(Factory("staff", "张三")); console.log(Factory("", "张三")); 复制代码
通过一个函数将创建对象的过程单独封装,外界在调用工厂模式函数创建对象时不需要关注各个角色具体如何实现,只负责调用时传递相应的参数即可 就像我们自己去菜市场买菜自己动手炒菜时,我们就需要按部就班的洗菜、切菜、炒菜、装盘等操作,然后才能得到一盘菜。去饭店直接下单让厨师炒菜时我们并不关心厨师如何做的,最终会直接将一盘菜端到我们的餐桌上,简单工厂模式就类似直接去餐馆点单
下面看一下简单工厂模式的UML:
作者:Nordon
链接:https://juejin.cn/post/7015812263344881701