当前位置: 首页 > news >正文

【设计模式】工厂模式和抽象工厂模式

工厂模式

function User(role, pages) {this.role = role;this.pages = pages;
}// new User('admin', ['home', 'user', 'setting']);
// new User('user', ['home', 'user']);
// new User('guest', ['home']);function UserFactory(role) {switch (role) {case 'admin':return new User(role, ['home', 'user', 'setting']);break;case 'user':return new User(role, ['home', 'user']);break;case 'guest':return new User(role, ['home']);break;default:throw new Error('未知角色')}
}

es6 的写法:

class User {constructor(role, pages) {this.role = role;this.pages = pages;}static getInstance(role) {switch (role) {case 'admin':return new User(role, ['home', 'user', 'setting']);break;case 'user':return new User(role, ['home', 'user']);break;case 'guest':return new User(role, ['home']);break;default:throw new Error('未知角色')}}
}User.getInstance('admin'); // {role: 'admin', pages: ['home', 'user', 'setting']}

简单工厂的优点在于,你只需要一个正确的参数,就可以获取到你所需要的对象,而无需知道其创建的具体细节。

但是在函数内包含了所有对象的创建逻辑和判断逻辑的代码,每增加新的构造函数还需要修改判断逻辑代码。当我们的对象不是上面的3个而是10个或更多时,这个函数会成为一个庞大的超级函数,变得难以维护。

所以,简单工厂只能作用于创建的对象数量较少,对象的创建逻辑不复杂时使用。

抽象工厂模式

class User {constructor(name, role, pages) {this.name = name;this.role = role;this.pages = pages;}welcome() {console.log(`欢迎${this.name}使用本系统`)}showPage() {// js 中没有内置的 abstractthrow new Error(`请实现 showPage 方法`)}
}class SuperAdmin extends User {constructor(name) {super(name, 'superAdmin', ['home', 'user', 'setting']);}showPage() {console.log(`超级管理员拥有以下页面:${this.pages.join(' ')}`)}addUser() {console.log(`添加用户`)}addRight() {console.log(`添加权限`)}
}class Editor extends User {constructor(name) {super(name, 'editor', ['home', 'user']);}showPage() {console.log(`编辑拥有以下页面:${this.pages.join(' ')}`)}}
function getAbstractUserFactory(role) {switch (role) {case 'superAdmin':return SuperAdmin;case 'editor':return Editor;default:throw new Error(`没有找到对应的角色`)}
}
const userClass = getAbstractUserFactory('editor');
const user = new userClass('张三');
user.showPage(); // 编辑拥有以下页面:home user

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2020 位示图
  • 十五、OpenCVSharp实现相机标定
  • 关于栈(顺序栈)的知识讲解
  • 使用AWS Lambda轻松开启Amazon Rekognition之旅
  • 如何在C++ QT 程序中集成cef3开源浏览器组件去显示网页?
  • 加解密:一文搞懂对称加密与非对称加密
  • 小程序音频播放相关
  • Nuxt3【服务器】server 详解
  • day05-SpringBoot基础
  • 全面解析ETL:数据仓库架构中的关键处理过程
  • 【流媒体】RTMPDump—Download(接收流媒体信息)
  • 【数据结构-距离合】力扣1685. 有序数组中差绝对值之和
  • 前端宝典十:webpack性能优化最佳实践
  • JS逆向高阶补充
  • Eureka故障排查指南:常见问题与解决方案
  • 《深入 React 技术栈》
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • canvas 绘制双线技巧
  • Druid 在有赞的实践
  • iOS | NSProxy
  • Java 23种设计模式 之单例模式 7种实现方式
  • Meteor的表单提交:Form
  • mongo索引构建
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • win10下安装mysql5.7
  • zookeeper系列(七)实战分布式命名服务
  • 程序员该如何有效的找工作?
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 分享一份非常强势的Android面试题
  • 服务器之间,相同帐号,实现免密钥登录
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 警报:线上事故之CountDownLatch的威力
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端代码风格自动化系列(二)之Commitlint
  • 数据科学 第 3 章 11 字符串处理
  • 学习JavaScript数据结构与算法 — 树
  • 用 Swift 编写面向协议的视图
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • MPAndroidChart 教程:Y轴 YAxis
  • PostgreSQL之连接数修改
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​批处理文件中的errorlevel用法
  • ​浅谈 Linux 中的 core dump 分析方法
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • "无招胜有招"nbsp;史上最全的互…
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #07【面试问题整理】嵌入式软件工程师
  • #etcd#安装时出错
  • #if #elif #endif
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (二)hibernate配置管理
  • (二)Linux——Linux常用指令