前端开发的工厂设计模式

在前端开发中,工厂设计模式(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.rhkb.cn/news/363128.html

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

相关文章

如何利用“AI交互数字人+展厅”拓展文娱消费空间?

打造新生代潮玩聚集地,打造演艺新空间,促进虚拟现实体验等文娱业态场景创新,成为了当下发展文旅消费新场景的一大重要手段。数字人汇集了虚拟现实、增强现实、全息投影、人工智能、实时传输语音合成等数字技术,可以利用数字人重构…

Python 语法基础一

1.变量 python 中变量很简单,不需要指定数据类型,直接使用等号定义就好。python变量里面存的是内存地址,也就是这个值存在内存里面的哪个地方,如果再把这个变量赋值给另一个变量,新的变量通过之前那个变量知道那个变量…

大模型赋能全链路可观测性:运维效能的革新之旅

目录 全链路可观测工程与大模型结合---提升运维效能 可观测性(Observability)在IT系统中的应用及其重要性 统一建设可观测数据 统一建设可观测数据的策略与流程 全链路的构成和监控形态 云上的全链路可视方案 为什么一定是Copilot 大模型的Copilo…

vue+fineReport 使用前端搜索+报表显示数据

--fineReprot 将需要搜索的参数添加到模版参数 sql: --前端传递参数 注:因为每次点击搜索的结果需要不一样,还要传递一个时间戳的参数: let timesamp new Date().getTime()

云计算【第一阶段(18)】磁盘管理与文件系统 分区格式挂载(一)

目录 一、磁盘基础 二、磁盘结构 2.1、机械硬盘 2.2、固态硬盘 2.3、扩展移动硬盘 2.4、机械磁盘的一些计算(了解) 2.5、磁盘接口类型 二、Linux 中使用的文件系统类型 2.1、磁盘分区的表示 2.1.1、主引导记录(MBR) 2.1.2、Linux中将硬盘、分…

MCU的最佳存储方案CS创世 SD NAND

大家都知道MCU是一种"麻雀"虽小,却"五脏俱全"的主控。它的应用领域非常广泛,小到手机手表,大到航空航天的设备上都会用到MCU.市面上目前几个主流厂商有意法半导体(其中最经典的一款就是STM32系列)…

布尔运算00

题目链接 布尔运算 题目描述 注意点 运算符的数量不超过 19 个布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成算出有几种可使该表达式得出 result 值的括号方法 解答思路 可以使用动态规划根据左右两侧区间不同结果相应组合数量计算得出当前…

宠物空气净化器真的有必要买吗?养宠家庭建议看完这篇再考虑入手

可爱的猫咪是爱猫人士的心头好,但猫咪们的掉毛问题却一直困扰着不少人,猫浮毛在空气中乱飘,不但污染环境,还可能引发过敏和哮喘等呼吸道疾病。 作为一个家电推荐官,我有对付猫咪浮毛、异味的神器———宠物空气净化器…

将CSV、Excel、XML文件转换为MySQL数据库

在平时的工作中,经常会遇到需要将文件数据导入到数据库中的情况。有些客户之前可能只使用Excel表格作为记录工具,但当数据量达到一定程度或者需要将数据导入到其他系统中时,就会很emo,因为Excel表格虽然方便,但在数据处理和管理方…

在 UBUNTU 22.04 上逐步构建 Postal SMTP 服务器

构建 Postal SMTP 服务器来发送批量电子邮件是电子邮件营销人员的不错选择。Postal 功能非常强大,并拥有大量开发人员的支持。它是一个用 JavaScript 和 Ruby 编写的开源邮件服务器脚本。它可用于构建内部 SMTP 服务器,就像 Mailgun、Sendgrid、Mailchim…

慢动作视频怎么制作?5种方法,轻松制作慢动作视频

在短视频风靡的当下,慢动作视频凭借其独特的视觉效果和引人入胜的节奏感,成为了吸引观众眼球的利器。你是否也想知道如何制作这种令人心动的慢动作视频呢?下面教大家5种能够制作出慢动作视频的方法,一起来学习下吧。 方法一&#…

openEuler 22.03 (LTS-SP1)服务器用ntpd同步GPS时间服务器的案例

本文记录了openEuler 22.03 (LTS-SP1)的二级时间服务器用chronyd不能自动同步GPS时间服务器,改用ntpd同步GPS时间服务器成功的案例 一、环境简述 1、本环境中有两台GPS一级时间服务器,IP如下: 192.168.188.66 192.168.188.74 2、有一台o…

分布式kettle调度管理平台简介

介绍 Kettle(也称为Pentaho Data Integration)是一款开源的ETL(Extract, Transform, Load)工具,由Pentaho(现为Hitachi Vantara)开发和维护。它提供了一套强大的数据集成和转换功能&#xff0c…

51循迹小车(蓝牙+循迹+超声波+舵机+避障L298N)

基本驱动 L298N电机驱动模块负责供电和控制电机驱动 将电池12V供电接到12V供电上,作为输入。单片机及其他器件供电可以使用5V供电,这里的GND都接到一起。 输出A和输出B接到电机上,负责给电机供电和控制电机。 通道A使能和通道B使能以及逻…

【Confluence】markdown格式转换为Confluence

简单的文本可以使用网站来快速转换,但是发现很多格式不能正确转换,所以研究了一个Py的方法来实现,如下: 安装Py插件 本方法主要借用markdown2 来实现,开始之前需要先安装一些库。 pip install markdown2 beautiful…

TCP 和 UDP 可以同时绑定相同的端口吗?

在网络编程中,TCP和UDP都可以绑定到同一个端口上进行通信。TCP和UDP是OSI模型中的传输层协议,它们分别使用不同的端口号来区分不同的应用程序或服务。 TCP(Transmission Control Protocol)提供了面向连接的、可靠的传输服务&…

python办公自动化之excel

用到的库:openpyxl 实现效果:读取单元格的值,写入单元格 代码: import openpyxl # 打开现有工作簿 workbookopenpyxl.load_workbook(现有工作簿.xlsx) # 选择一个工作表 sheetworkbook[交易表] # 读取单元格的值 cell_valueshe…

webpack【实用教程】

基础配置 配置的拆分和合并 通常 webpack 的配置文件会有3个 webpack.common.js 公共配置(会被另外两个配置文件导入并合并)webpack.dev.js 开发环境的配置webpack.prod.js 生产环境的配置 开发环境的本地服务 在 webpack.dev.js 中配置 devServer:…

钡铼BL104智慧环保多个485采集转MQTT无线传输

PLC物联网关BL104是一款专为工业环境设计的先进协议转换网关,其集成了钡铼智能技术和环保多个485采集转MQTT无线传输功能,为工业控制系统提供了高效的数据采集、传输和管理解决方案。 技术规格与功能特点 PLC物联网关BL104采用钡铼智能技术&#xff0c…

PPT怎么录制视频?这里有你想要的答案!

“有人知道ppt怎么录制视频吗?我正在准备一个关于新产品功能介绍的演示文稿,希望能将我的ppt转化为一个专业且生动的视频讲解。我尝试了一些方法,但不知道从哪里开始。有没有哪位朋友能分享一下自己录制ppt视频的经验吗?” 在数字…