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

embedded/2024/10/18 23:28:12/

工厂模式

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

http://www.ppmy.cn/embedded/97795.html

相关文章

Vue3+Vite安装配置tailwindCss

考虑到官网不是很好访问,这里记录一下简单步骤方便小友查阅 1. 安装依赖 npm install -D tailwindcss postcss autoprefixer2. 初始化配置文件 npx tailwindcss init -p3.配置模板路径 /** type {import(tailwindcss).Config} */ export default {content: [&quo…

华为的流程管理

华为建设流程体系始于2000年,那时华为公司面临着快速扩张和全球化发展的挑战,意识到传统的管理模式已经无法满足业务发展的需求。为了提高公司的管理效率和竞争优势,华为决定启动流程体系的建设。在建设过程中,华为借鉴了业界最佳…

《博客崩溃源记》

原文链接:https://www.hezebin.com/publish/66a393d03ad6ee047813fe57 背景 百年未有之大变局年夏初,最近在负责前端同学招聘的一面工作,对于一些常见的八股文基础问题做了一下记录… 忽有一日,面试在即,打开博客见…

算法刷题day35|动态规划:121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II、123. 买卖股票的最佳时机 III

121. 买卖股票的最佳时机 一维dp class Solution { public:int maxProfit(vector<int>& prices) {if (prices.size() 0) return 0;vector<int> dp(prices.size(), 0);dp[0] 0;int mint INT_MAX;for (int i 1; i < prices.size(); i){//更新最小股票值…

基于vue篮球联盟管理系统pf

TOC springboot476基于vue篮球联盟管理系统pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域…

C#单例模式

&#xfeff;using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _3._3._6_单例模式 {public class Singleton{private static Singleton s_instance;private int _state;private Singleton(int …

c_cpp_properties.json、launch.json、 tasks.json

在 Visual Studio Code 中&#xff0c;c_cpp_properties.json、launch.json 和 tasks.json 是三个重要的配置文件&#xff0c;它们的作用如下&#xff1a; c_cpp_properties.json&#xff1a; 这个文件用于配置 C/C 扩展的 IntelliSense、编译器路径和包括路径等。它帮助 VS Co…

智慧安防/一网统管/视频监控EasyCVR视频汇聚平台的视频轻量化特点及应用

在数字化时代&#xff0c;视频监控已成为保障公共安全、提升管理效率的重要手段。随着技术的不断进步&#xff0c;EasyCVR视频汇聚平台应运而生&#xff0c;平台以其独特的视频轻量化特点在安防监控领域展现出强大的应用潜力。本文将详细探讨EasyCVR视频汇聚平台的视频轻量化特…