uniapp微信小程序-前端设计模式学习(中)

三、工厂模式

通俗解释(理解记忆) 

假设我们有一个汽车工厂。我们可以让工厂根据用户的选择生产不同型号的汽车,而用户无需知道具体的汽车制造过程。

工厂模式的优势在于,它隐藏了对象的创建细节,让客户端代码更简洁,同时使得系统更容易扩展。如果有新的汽车型号加入,只需要在工厂中添加相应的生产逻辑,而不需要修改客户端代码。

// 接口或基类
class Car {constructor(model) {this.model = model;}displayInfo() {console.log(`This is a ${this.model} car.`);}
}// 具体实现类
class Sedan extends Car {constructor() {super('Sedan');}
}class SUV extends Car {constructor() {super('SUV');}
}// 工厂
class CarFactory {createCar(type) {switch (type) {case 'sedan':return new Sedan();case 'suv':return new SUV();default:throw new Error('Invalid car type');}}
}// 客户端代码
const factory = new CarFactory();const sedanCar = factory.createCar('sedan');
sedanCar.displayInfo(); // 输出: This is a Sedan car.const suvCar = factory.createCar('suv');
suvCar.displayInfo(); // 输出: This is a SUV car.

Car 是一个基类,而 SedanSUV 是具体的实现类。CarFactory 是工厂类,根据传入的类型创建相应的汽车实例。客户端代码只需要调用工厂的方法,而不需要关心具体的汽车实现类。

对比一下如果不使用工厂模式

// 没有使用工厂模式的代码
class Sedan {constructor() {this.model = 'Sedan';}displayInfo() {console.log(`This is a ${this.model} car.`);}
}class SUV {constructor() {this.model = 'SUV';}displayInfo() {console.log(`This is a ${this.model} car.`);}
}// 客户端代码
const sedanCar = new Sedan();
sedanCar.displayInfo(); // 输出: This is a Sedan car.const suvCar = new SUV();
suvCar.displayInfo(); // 输出: This is a SUV car.

客户端直接实例化了 SedanSUV,导致客户端代码与具体的汽车类耦合在一起。如果需要添加新的汽车类型,客户端代码就需要修改,不符合开闭原则。("开闭原则"是面向对象设计中的一个原则,指的是一个软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。简单来说,当需要添加新功能时,应该通过扩展现有代码来实现,而不是直接修改已有的代码。)

现在假设要添加一种新的汽车类型,比如电动车,客户端代码就需要修改  

class ElectricCar {constructor() {this.model = 'Electric Car';}displayInfo() {console.log(`This is an ${this.model}.`);}
}// 修改客户端代码
const electricCar = new ElectricCar();
electricCar.displayInfo(); // 输出: This is an Electric Car.

如果使用工厂模式添加新的类型

// 定义汽车接口
class Car {displayInfo() {}
}// 具体的 Sedan 汽车类
class Sedan extends Car {constructor() {super();this.model = 'Sedan';}displayInfo() {console.log(`This is a ${this.model}.`);}
}// 具体的 SUV 汽车类
class SUV extends Car {constructor() {super();this.model = 'SUV';}displayInfo() {console.log(`This is an ${this.model}.`);}
}// 新的 ElectricCar 汽车类
class ElectricCar extends Car {constructor() {super();this.model = 'Electric Car';}displayInfo() {console.log(`This is an ${this.model}.`);}
}// 汽车工厂
class CarFactory {createCar(type) {switch (type) {case 'Sedan':return new Sedan();case 'SUV':return new SUV();case 'ElectricCar':return new ElectricCar();default:throw new Error('Invalid car type.');}}
}// 客户端代码
const carFactory = new CarFactory();// 使用工厂创建 Sedan
const sedan = carFactory.createCar('Sedan');
sedan.displayInfo(); // 输出: This is a Sedan.// 使用工厂创建 SUV
const suv = carFactory.createCar('SUV');
suv.displayInfo(); // 输出: This is an SUV.// 使用工厂创建 ElectricCar
const electricCar = carFactory.createCar('ElectricCar');
electricCar.displayInfo(); // 输出: This is an Electric Car.

优点

  1. 封装对象创建过程: 工厂模式将对象的创建过程封装在工厂类中,使客户端无需关心对象的具体创建细节,提高了代码的封装性。
  2. 降低耦合性: 客户端代码与具体产品类解耦,通过工厂类创建对象,减少了对具体类的依赖,降低了系统的耦合性。
  3. 易于扩展: 新增产品类只需扩展工厂类,无需修改客户端代码,符合开闭原则,使系统更易于扩展。
  4. 统一管理: 工厂模式可以统一管理对象的创建,集中控制,有利于维护和管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《HTML 简易速速上手小册》第10章:HTML 的维护与优化(2024 最新版)

文章目录 10.1 网页性能优化10.1.1 基础知识10.1.2 案例 1:优化网页图像10.1.3 案例 2:使用延迟加载优化性能10.1.4 案例 3:优化 CSS 和 JavaScript 的加载 10.2 SEO 最佳实践10.2.1 基础知识10.2.2 案例 1:创建一个 SEO 友好的博…

数据库管理-第139期 做大还是做小-Oracle名称哪些事(20240125)

数据库管理139期 2024-01-25 第139期 做大还是做小-Oracle名称哪些事(20240125)1 问题2 排查3 扩展总结 第139期 做大还是做小-Oracle名称哪些事(20240125) 作者:胖头鱼的鱼缸(尹海文) Oracle A…

麒麟系统—— openKylin 安装 mongodb

麒麟系统—— openKylin 安装 mongodb 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。 二、下载解压 MongoDB二、增加环境变量三、配置MongoDB创建数据目录创建日志文件运行 四、加入到服务中 MongoDB是一款高性能、开源的NoSQL数据库,因其灵活的数据结构、…

python第五节:集合set(3)

集合遍历 for循环遍历集合中元素 例子1: set1 {a,b,cde,张三,123} for i in set1: print(i) 结果: a cde b 张三 123 enumerate遍历索引和元素 例子2: set1 {a,b,cde,张三,123} for index,value in enumerate(set1): print(index…

MyBatis 的注解实现方法

MyBatis 的注解实现方法 MyBatis 的注解实现方法引入依赖添加配置创建表创建实体类创建mapper接口InsertDeleteSelectResults和ResultMap通过配置文件解决 UpdateOptions MyBatis 的注解实现方法 引入依赖 在springBoot项目中下载了EditStarters插件的,可以直接在配置文件处右…

效率高的B树系列

文章目录 前言B树概念性质插入数据分析代码实现性能分析 B树概念特性插入数据分析应用 B*树概念B*树的分裂 总结B树系列的区别B树系列对比哈希和平衡搜索树 前言 前面我们所学习到的数据结构,只能用来存储少量的数据,因为内存大小是非常有限的&#xff…

obs-studio 源码学习 obs.h

obs.h 引用头文件介绍 c99defs.h:这个头文件提供了一些 C99 标准的定义和声明,包括一些常用的宏定义和类型定义,用于提高代码的可移植性和兼容性。 bmem.h:这个头文件提供了对内存分配和管理的功能,包括一些内存分配…

一个查询IP地理信息和CDN提供商的离线终端工具Nali官方使用指南

Nali 一个查询IP地理信息和CDN提供商的离线终端工具. 功能 支持多种数据库 纯真 IPv4 离线数据库ZX IPv6 离线数据库Geoip2 城市数据库 (可选)IPIP 数据库 (可选)ip2region 数据库 (可选)DB-IP 数据库 (可选)IP2Location DB3 LITE 数据库 (可选)CDN 服务提供商查询支持管道处…

.ui文件相关

目录 ui类生成过程: 提问: 等以后自己熟练了用代码写这些样式内容,尽量用代码写,原因很简单: 用代码写的可以直接修改代码,但是在设计界面修改的东西,电脑没有QC这玩意,还真不好改…

Gitlab7.14 中文版安装教程

Gitlab7.14 中文版安装教程 注: 本教程由羞涩梦整理同步发布,本人技术分享站点:blog.hukanfa.com转发本文请备注原文链接,本文内容整理日期:2024-01-28csdn 博客名称:五维空间-影子,欢迎关注 …

JWT(JSON Web Token)详解以及在go-zero中配置的方法

目的 对用户进行身份认证和信息交换 RFC 7519 传统方式 通过session保存对话信息,服务端返回一个session id,用户保存这个id在cookie内,然后每次请求都传给服务端 局限性 对于服务器集群难以向每个服务器共享同一session jwt的方式是…

【vue】vue.config.js里面获取本机ip:

文章目录 一、效果:二、实现: 一、效果: 二、实现: const os require(os);function getLocalIpAddress() {const interfaces os.networkInterfaces();for (let key in interfaces) {const iface interfaces[key];for (let i …

第九节HarmonyOS 常用基础组件16-Blank

1、描述 空白填充组件,在容器主轴方向上,空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column/Flex时生效。 2、接口 Blank(min?: number | string) 3、参数 参数名 参数类型 必填 描述 min number|string 否 空白填充组件…

牛客周赛 Round 30(A~E)

A A题签到题直接输出0和2即可 #include <bits/stdc.h> #define rep(i,a,b) for(int i (a); i < (b); i) #define fep(i,a,b) for(int i (a); i > (b); --i) #define ls p<<1 #define rs p<<1|1 #define PII pair<int, int> #define ll long …

写静态页面——前端总结

0、怎么写一个前端页面: HTML是超文本标记语言,它用来写前端的内容和框架,CSS是层叠样式表,它用来给前端写样式,让内容变漂亮。1、要写前端页面需要用VScode代码编辑器: VScode当中可以下载汉化插件、快捷键插件(eclipse)浏览器用于解析html/css/js代码,浏览器是从上往…

数据分析入门指南:用 Python 开启数据之旅

文章目录 前言发现宝藏为什么选择 Python 进行数据分析&#xff1f;准备工作数据分析基础1. 数据加载2. 数据探索3. 数据清洗4. 数据可视化 探索更多可能性好书推荐总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。…

成都直播产业园核心优势全面解读,入驻天府锋巢直播产业基地都有哪些好处?

一文讲清&#xff01;成都直播产业园核心优势全面解读 企业入驻天府锋巢直播产业基地能获得哪些好处&#xff1f; 锋巢资讯&#xff5e;又来了&#xff5e;&#xff5e;&#xff5e; 今天&#xff0c;将为您全面解读成都产业园重点特色产业服务&#xff08;上&#xff09; 什…

Android 13以上版本读写SD卡权限适配

如题&#xff0c;最近工作上处理的问题&#xff0c;把解决方案简单逻列出来&#xff0c;供有需要的朋友参考之 解决方案&#xff1a; 1、配置权限 <uses-permission android:name"android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name&q…

C++从零开始的打怪升级之路(day25)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector的题目 1.两数之和 1. 两数之和 给定一…

(自用)learnOpenGL学习总结-高级OpenGL-立方体贴图

ok终于来到了立方体贴图了&#xff0c;在这里面我们可以加入好看的天空包围盒&#xff0c;这样的画我们的背景就不再是黑色的了&#xff01; 首先&#xff0c;立方体贴图和前面的sampler2D贴图一样&#xff0c;不过是6个2D组成的立方体而已。 那么为什么要把6个组合在一起呢&…