一天一个设计模式---工厂方法

概念

工厂模式是一种创建型设计模式,其主要目标是提供一个统一的接口来创建对象,而不必指定其具体类。工厂模式将对象的实例化过程抽象出来,使得客户端代码不需要知道实际创建的具体类,只需通过工厂接口或方法来获取所需的对象。

具体内容

工厂模式通常包括以下几个角色:

  1. 抽象产品(Abstract Product): 定义了产品的接口,具体的产品类必须实现这个接口。
  2. 具体产品(Concrete Product): 实现了抽象产品接口的具体类,是工厂模式真正创建的对象。
  3. 抽象工厂(Abstract Factory): 声明了创建产品的接口,通常包括一个或多个方法,每个方法对应一个具体产品的创建。
  4. 具体工厂(Concrete Factory): 实现了抽象工厂接口,负责实际创建具体产品的对象。

类结构图

在这里插入图片描述

适用场景

工厂模式的优点包括:

  • 封装对象的创建过程: 客户端不需要知道对象的具体创建方式,只需通过工厂接口获取所需对象,降低了耦合性。
  • 易于扩展: 如果需要添加新的产品类,只需扩展抽象产品和具体产品,同时创建新的具体工厂即可,不需要修改客户端代码。
  • 符合开闭原则: 对扩展开放,对修改关闭。可以轻松地添加新产品类,而不影响已有代码。

工厂模式的缺点包括:

  • 增加了类的数量: 引入了抽象工厂和具体工厂,增加了类的数量,可能使代码结构复杂。
  • 需要一定的抽象能力: 需要正确地定义抽象产品和工厂接口,如果定义不合理,可能会导致系统难以理解和维护。

实现

// 抽象产品
class Product {constructor(name) {this.name = name;}
}// 具体产品A
class ConcreteProductA extends Product {constructor() {super('ProductA');}
}// 具体产品B
class ConcreteProductB extends Product {constructor() {super('ProductB');}
}// 抽象工厂
class Factory {createProduct() {// 定义创建产品的接口}
}// 具体工厂A
class ConcreteFactoryA extends Factory {createProduct() {return new ConcreteProductA();}
}// 具体工厂B
class ConcreteFactoryB extends Factory {createProduct() {return new ConcreteProductB();}
}// 客户端代码
const factoryA = new ConcreteFactoryA();
const productA = factoryA.createProduct();
console.log(productA.name); // 输出: ProductAconst factoryB = new ConcreteFactoryB();
const productB = factoryB.createProduct();
console.log(productB.name); // 输出: ProductB

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

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

相关文章

《矩阵分析》笔记

来源:【《矩阵分析》期末速成 主讲人:苑长(5小时冲上90)】https://www.bilibili.com/video/BV1A24y1p76q?vd_sourcec4e1c57e5b6ca4824f87e74170ffa64d 这学期考矩阵论,使用教材是《矩阵论简明教程》,因为没…

全球企业绿色供应链数据(含CITI指数和CATI指数,2014-2023年)

数据简介:发文趋势与主题分布 数据来源:公众环境研究中心(IPE) 时间跨度 CITI指数:2014-2023年; CATI指数:2021-2023年 数据范围:品牌型企业,温室气体重点排放行业的上…

某市公共资源交易网

目标网站首页:aHR0cDovL2dnenkuendmd2IudGouZ292LmNu/ 分析页面:aHR0cDovL2dnenkuendmd2IudGouZ292LmNuL3h3engvaW5kZXhfMi5qaHRtbA 点击前URL http://ggzy.zwfwb.tj.gov.cn:80/zwyw/1030977.jhtml 点击后URL http://ggzy.zwfwb.tj.gov.cn/zwyw/PtP89W…

Kettle Local引擎使用记录(二):问题记录及解决方法

Kettle Local 📚 前言⁉️问题记录❓问题一:Database type not found!…database type with plugin id [Oracle] couldnt be found!❕原因:没有初始化Kettle环境❗解决:添加监听器,进行Kettle环境初始化 ❓问题二&…

Spring 见解 7 基于注解的AOP控制事务

8.基于注解的AOP控制事务 8.1.拷贝上一章代码 8.2.applicationContext.xml <!-- 开启spring对注解事务的支持 --> <tx:annotation-driven transaction-manager"transactionManager"/> 8.3.service Service Transactional(readOnlytrue,propagation Pr…

需求跟踪矩阵(RTM)是什么

什么是可追溯性矩阵&#xff1f; 可追溯性矩阵是一个文档&#xff0c;它与需要多对多关系以检查关系的完整性的任何两个基线文档相关联。它用于跟踪需求并检查是否满足当前项目需求。 什么是需求追踪矩阵&#xff1f; 需求可追溯性矩阵&#xff08;RTM&#xff09;是一个文档…

自动化软件测试流程的七个步骤和内容

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;软件测试面试题分享&#xff1a; 1000道软件测试面试题及答案&#x1f4e2;软件测试实战项目分享&#xff1a; 纯接口项目-完…

java 创建一个可执行的jar包小程序

第1步&#xff1a;写好代码 public class Main {public static void main(String[] args) {String str "hahah";if (StringUtils.isBlank(str)) {System.out.println(str);}System.out.println("Hello world!");} }第2步&#xff1a;设置 Artifact 选择入…

【netstat】

netstat netstat Proto是协议&#xff0c;TCP、UDP Recv-Q表示网络接收队列 Send-Q表示网络发送队列&#xff0c;没有ack的数据 Local Address本地ip地址和端口 Foreign Address服务器的ip和端口 State连接状态 State的种类&#xff1a; Established-活跃的连接 Listen-等待连…

软件测试|Python中的变量与关键字详解

简介 在Python编程中&#xff0c;变量和关键字是非常重要的概念。它们是构建和控制程序的基本要素。本文将深入介绍Python中的变量和关键字&#xff0c;包括它们的定义、使用方法以及一些常见注意事项。 变量 变量的定义 变量是用于存储数据值的名称。在Python中&#xff0…

听GPT 讲Rust源代码--compiler(12)

File: rust/compiler/rustc_data_structures/src/graph/dominators/mod.rs 文件mod.rs位于Rust编译器源代码中的rustc_data_structures/src/graph/dominators目录下。这个文件的作用是实现支配树&#xff08;dominator tree&#xff09;的计算算法。 在编译器优化中&#xff0c…

谁动了我的注册表?免费的注册表对比分析工具

关于这款工具&#xff0c;可以在B站搜谁动了我的注册表&#xff0c;UP主名字为有限的未知。该注册表对比分析工具视频教程链接如下。谁动了我的注册表&#xff1f;注册表比对分析工具 & 手动实现右键菜单自由_哔哩哔哩_bilibili 声明&#xff1a;该款注册表分析软件&#…

Redis之集群方案比较

哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c;哨兵的配置略微复杂&#xff0c;并且性能和高可用性等各方面表现一般&a…

【UE Niagara学习笔记】03 - 火焰喷射效果

目录 效果 步骤 一、创建粒子系统 二、制作火焰动画 三、改为GPU粒子 四、循环播放粒子动画 五、火焰喷射效果雏形 六、火焰颜色 效果 步骤 一、创建粒子系统 1. 新建一个Niagara系统&#xff0c;选择模板 命名为“NS_Flame_Thrower”&#xff08;火焰喷射&#…

学完Python,不做程序员,只接兼职,哎,就是玩儿

现在这个时代&#xff0c;人人开始追求做斜杠青年&#xff0c;多方面开展副业&#xff0c;赚取几份工资。有很多朋友就抓住了Python的风口&#xff0c;靠着Python兼职月入一万。那么学完Python&#xff0c;有哪些可以做的兼职呢&#xff1f; 一、闲暇时间&#xff0c;接自由单…

【css】快速实现鼠标悬浮变色效果

<div class"nav-item"><div class"ic-img"></div><div>切换</div> </div>.nav-item {width: 100rem;height: 45rem;line-height: 45rem;display: flex;text-align: center;justify-content: center;align-items: cent…

java每日一题——输出9x9乘法表(答案及编程思路)

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;输出下图9x9乘法表 编程思路&#xff1a;java只能输出行&#xff0c;不能输出列&#xff0c;所以考虑好每一行输出的内容即可 public class demo {public static void main(String[] args) {for (int i 1; i…

文档审阅批注的合并和对比

#创作灵感# 最近在改论文&#xff0c;Feedback返回的时候&#xff0c;把之前的批注都删了&#xff0c;这就增加了工作量&#xff0c;看起来不方便&#xff0c;所以就需要将删掉的批注全部复原。 那在原来的文档重新在修改一遍&#xff0c;工作量还是很大的&#xff0c;所以这里…

数字新生态:低代码开发的实践应用

低代码开发是一种快速构建软件应用程序的方法&#xff0c;极大地简化了传统编码的流程。本文将探讨数字新生态中低代码开发的实践应用&#xff0c;以及它如何推动业务创新和提高开发效率。 引言 随着信息技术的飞速发展&#xff0c;数字化转型已成为企业和组织的当务之急。但是…

两种方式实现mysql截取年月日

select date_format(now(), %Y-%m-%d) select substring(now(), 1, 10)