前端开发的工厂设计模式

在前端开发中,工厂设计模式(Factory Pattern)是一种非常有用的设计模式,能够帮助我们在创建对象时减少代码的重复性和复杂性。

一、工厂设计模式概述

工厂设计模式是一种创建型设计模式,主要目的是定义一个用于创建对象的接口,让子类决定实例化哪个类。通过这种方式,客户端在不指定具体类的情况下创建对象,从而提高代码的灵活性和可维护性。

工厂设计模式可以分为以下几种类型:

  1. 简单工厂模式:又称为静态工厂方法模式,工厂类决定创建哪一个产品类的实例。
  2. 工厂方法模式:定义一个创建对象的接口,但由子类决定实例化哪个类。
  3. 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

二、简单工厂模式

简单工厂模式通过一个工厂类来决定创建哪种具体产品类的实例。这个工厂类包含一个静态方法,根据传入的参数决定要创建的对象类型。

// 抽象产品
interface Product {use(): void;
}// 具体产品A
class ConcreteProductA implements Product {use(): void {console.log("Using ConcreteProductA");}
}// 具体产品B
class ConcreteProductB implements Product {use(): void {console.log("Using ConcreteProductB");}
}// 简单工厂
class SimpleFactory {static createProduct(type: string): Product {switch (type) {case 'A':return new ConcreteProductA();case 'B':return new ConcreteProductB();default:throw new Error("Invalid product type");}}
}// 测试
const productA = SimpleFactory.createProduct('A');
productA.use(); // 输出:Using ConcreteProductAconst productB = SimpleFactory.createProduct('B');
productB.use(); // 输出:Using ConcreteProductB

类图

三、工厂方法模式

工厂方法模式将对象的实例化推迟到子类,通过子类来决定创建哪种具体产品类的实例。这个模式使得工厂类的设计更加灵活和可扩展。

// 抽象产品
interface Product {use(): void;
}// 具体产品A
class ConcreteProductA implements Product {use(): void {console.log("Using ConcreteProductA");}
}// 具体产品B
class ConcreteProductB implements Product {use(): void {console.log("Using ConcreteProductB");}
}// 抽象工厂
interface Creator {factoryMethod(): Product;
}// 具体工厂A
class ConcreteCreatorA implements Creator {factoryMethod(): Product {return new ConcreteProductA();}
}// 具体工厂B
class ConcreteCreatorB implements Creator {factoryMethod(): Product {return new ConcreteProductB();}
}// 使用工厂方法模式
function clientCode(factory: Creator) {const computer = factory.factoryMethod();computer.use();
}// 测试
clientCode(new ConcreteCreatorA()) // 输出:Using ConcreteProductA
clientCode(new ConcreteCreatorB()) // 输出:Using ConcreteProductB

类图

三、抽象工厂模式

抽象工厂模式用于创建相关或依赖的对象族,而不需要指定具体类。它提供一个接口,用于创建一组相关或互相依赖的对象。

// 抽象产品A
interface AbstractProductA {use(): void;
}// 抽象产品B
interface AbstractProductB {eat(): void;
}// 具体产品A1
class ConcreteProductA1 implements AbstractProductA {use(): void {console.log("Using ConcreteProductA1");}
}// 具体产品A2
class ConcreteProductA2 implements AbstractProductA {use(): void {console.log("Using ConcreteProductA2");}
}// 具体产品B1
class ConcreteProductB1 implements AbstractProductB {eat(): void {console.log("Eating ConcreteProductB1");}
}// 具体产品B2
class ConcreteProductB2 implements AbstractProductB {eat(): void {console.log("Eating ConcreteProductB2");}
}// 抽象工厂
interface AbstractFactory {createProductA(): AbstractProductA;createProductB(): AbstractProductB;
}// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {createProductA(): AbstractProductA {return new ConcreteProductA1();}createProductB(): AbstractProductB {return new ConcreteProductB1();}
}// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {createProductA(): AbstractProductA {return new ConcreteProductA2();}createProductB(): AbstractProductB {return new ConcreteProductB2();}
}// 使用抽象工厂模式
function clientCode(factory: AbstractFactory) {const productA = factory.createProductA();const productB = factory.createProductB();productA.use();productB.eat();
}// 测试
clientCode(new ConcreteFactory1()); // 输出:Using ConcreteProductA1 和 Eating ConcreteProductB1
clientCode(new ConcreteFactory2()); // 输出:Using ConcreteProductA2 和 Eating ConcreteProductB2

 类图

四、工厂设计模式的应用场景

工厂设计模式适用于以下场景:

  1. 对象的创建过程复杂:当一个类的实例化过程比较复杂时,使用工厂模式可以简化客户端的代码。
  2. 需要大量创建相似对象:例如需要创建多个具有相同属性但行为不同的对象时,可以使用工厂模式。
  3. 系统的扩展性要求较高:当系统需要灵活地增加新功能时,工厂模式有助于降低代码的耦合度。

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

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

相关文章

2024年建筑八大员(资料员)考试题库,省心高效,轻松通过!

1.插入的图片无法显示,或者显示失真,正确做法是()。 A.插人图片是应选中【自动调整图片大小】 B.在下拉【菜单】中选中【按单元格式大小】插入 C.在【格式】下拉中【图片】处打钩 D.在【属性】下拉中选中【工具显示】 答案&a…

机械培训元宇宙:开启未来教育与职业培训的新篇章

随着科技的飞速发展,特别是虚拟现实(VR)、增强现实(AR)和人工智能(AI)等先进技术的广泛应用,我们正逐渐步入一个全新的时代——元宇宙。在这个虚拟的、由无数个并行宇宙组成的世界中…

两张图片怎样拼在一起?将两张图片拼在一起的几种方法介绍

两张图片怎样拼在一起?拼接两张图片是一种常见的编辑技巧,能够将不同的视觉元素融合成一个整体,从而创造出更加生动和丰富的图像效果。无论是为了设计创意作品、制作社交媒体内容,还是简单地为个人相册增添趣味,掌握如…

Java锁

乐观锁 什么是乐观锁 每次去拿数据的时候都认为别人不会修改,更新的时候会判断别人是否更新过数据,通过版本来判断,如果数据被修改了就拒绝更新Java里面大量使用CAS,CAS就是属于乐观锁,性能较悲观锁有很大的提高。Atom…

Element-UI 并排显示多个 disabled按钮的时候, 不生效问题解决

目录 Element-UI 并排显示多个 disabled按钮的时候, 不生效问题解决 解决方法: 运行结果: Element-UI 并排显示多个 disabled按钮的时候, 不生效问题解决 解决方法: Element-UI 并排显示多个 disabled按钮的时候&a…

LeetCode.4寻找两个正序数组的中位数

问题描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。 算法的时间复杂度应该为 O(log (mn)) 。 解题思路1 理解问题的关键是要意识到,对于一个已排序的数组或两个数组的合并…

hbase 优化节点进程停止方式

一、命令 /usr/local/fqlhadoop/hbase/bin/graceful_stop.sh 4.hadoop3.com日志: [biadmin4 ~]$ /usr/local/fqlhadoop/hbase/bin/graceful_stop.sh 4.hadoop3.com 2024-06-24T09:42:27 Disabling load balancer log4j:WARN No such property [maxBackupIndex] in…

spring boot 3.0.1多模块项目使用nacos动态配置

根pom文件增加&#xff0c;spring-cloud-alibaba包管理&#xff0c;注意版本spring-boot 3.0.3&#xff0c;spring-cloud-alibaba 2022.0.0.0-RC1 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0…

学习笔记——交通安全分析10

目录 前言 当天学习笔记整理 4信控交叉口交通安全分析 结束语 前言 #随着上一轮SPSS学习完成之后&#xff0c;本人又开始了新教材《交通安全分析》的学习 #整理过程不易&#xff0c;喜欢UP就点个免费的关注趴 #本期内容接上一期09笔记 当天学习笔记整理 4信控交叉口交…

我的创作纪念日学期总结

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; 关于博主 目录 &#x1f308;前言&#x1f525;我的期末考试&#x1f525;我的学期总结&#x1f525;对未来的展望&#x1f308;结语 &#x1f308;前言 本篇博客主要内容&#xff1a;博…

归并排序和计数排序

目录 1.归并排序1.1递归1.1基本思想1.2算法描述1.3画图解释1.4代码实现 1.2非递归 2.计数排序2.1基本思想2.2算法描述3.画图解释 1.归并排序 1.1递归 1.1基本思想 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xf…

【C++】动态内存管理new和delete

文章目录 一、C的内存管理方式二、new和delete的用法1.操作内置类型2.操作自定义内置类型 三、new和delete的底层实现1.operator new和operator delete函数2.new和delete的实现原理 四、定位new表达式五、malloc/free和new/delete的区别 一、C的内存管理方式 之前在C语言的动态…

kafka(四)消息类型

一、同步消息 1、生产者 同步发送的意思就是&#xff0c;一条消息发送之后&#xff0c;会阻塞当前线程&#xff0c;直至返回 ack。 由于 send 方法返回的是一个 Future 对象&#xff0c;根据 Futrue 对象的特点&#xff0c;我们也可以实现同 步发送的效果&#xff0c;只需在调…

【数据结构】计数排序等排序

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

C 语言实例 - 查找数组中最大的元素值

查找数组中最大的元素值。 实例 1 #include <stdio.h>int main() {int array[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};int loop, largest;largest array[0];for(loop 1; loop < 10; loop) {if( largest < array[loop] ) largest array[loop];}printf("最大…

Ubuntu系统中创建桌面快捷方式和添加Favorites

一. Ubuntu系统中创建软件的桌面快捷方式 Ubuntu桌面创建某个软件的桌面快捷方式&#xff0c;一个直观的方法。 方法1. 在图像界面下&#xff0c;一层一层地打开文件目录软件快捷方式/usr/share/applications/ 方法2. 或者在终端运行$ nautilus /usr/share/applications/ …

Django靓号管理系统:实现注销功能和重构视图

1. 重构项目结构 首先,我们需要重构项目结构,以更好地组织代码: 在​​web​​目录下创建一个新的​​views​​目录。在​​views​​目录中创建一个新文件​​account.py​​。删除原来的​​views.py​​文件。这样的结构更有利于代码的模块化和维护。 2. 更新 ​​url…

springcloud-config git配置源加载(部署公钥问题)

使用gitUrl作为配置源 gitee 或者github 中有类似于发布密钥的功能&#xff0c;允许通过私钥只读访问指定的仓库&#xff0c;文档中说的是 限制了git的操作为pull 和 clone。生成私钥的方式文档连接在此 https://gitee.com/help/articles/4181#article-header0 spring config只…

简过网:不懂就要问,什么叫考事业单位编制?

不懂就要问&#xff0c;什么叫考事业单位编制&#xff1f;考事业编就是纳入编制的事业单位招聘考试&#xff0c;本质上是还是一种招聘考试&#xff0c;由于是“铁饭碗”&#xff0c;福利好&#xff0c;待遇高&#xff0c;所以对于事业单位的考试一直受人关注。 ​ 一、什么是事…

深度分析 Apache Hudi:大数据实时处理的利器

什么是 Apache Hudi&#xff1f; Apache Hudi&#xff08;Hadoop Upsert Delete and Incremental&#xff09;是一个开源的数据湖存储框架&#xff0c;旨在在大规模数据集上提供高效的增量数据处理和实时数据更新能力。Hudi 由 Uber 开发&#xff0c;并于 2019 年捐赠给 Apach…