一天一个设计模式---生成器模式

概念

生成器模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。它允许您逐步构造一个对象,将构建过程与最终对象的表示分离开来。这种模式通常用于创建复杂的对象,这些对象可能有多个部分组成,且构建过程可能涉及多个步骤或配置选项。

具体内容

生成器模式的主要目的是将对象的构建步骤解耦,使得您可以灵活地创建不同表示的对象,同时保持构建过程的清晰性和可维护性。它通常包含以下几个关键角色:

  1. 产品(Product): 要创建的复杂对象,该对象通常由多个部分组成。在生成器模式中,可以有多种表示形式的产品。
  2. 生成器(Builder): 定义了创建产品的接口和步骤,以及设置产品各个部分的方法。生成器抽象类或接口可能包含多个构建方法,每个方法负责构建产品的一个特定部分。
  3. 具体生成器(Concrete Builder): 实现生成器接口,负责实际构建产品的步骤和逻辑。具体生成器将产品的构建细节封装在内部,并实现了生成器中定义的构建方法。
  4. 导演(Director): 可选角色,负责指导具体生成器构建产品的步骤顺序。导演可以知道构建过程的顺序,然后委托具体生成器执行构建步骤以创建最终的产品。

类结构图

在这里插入图片描述

适用场景

作为一种创建型的设计模式,以下情况你可以考虑使用它:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

实现

// 1. 产品(Product)
class Product {constructor() {this.parts = [];}addPart(part) {this.parts.push(part);}show() {console.log("Product Parts: ", this.parts.join(", "));}
}// 2. 生成器接口(Builder)
class Builder {constructor() {this.product = new Product();}buildPartA() {}buildPartB() {}buildPartC() {}getResult() {return this.product;}
}// 3. 具体生成器(Concrete Builder)
class ConcreteBuilder extends Builder {buildPartA() {this.product.addPart("PartA");}buildPartB() {this.product.addPart("PartB");}buildPartC() {this.product.addPart("PartC");}
}// 4. 导演(Director)
class Director {constructor(builder) {this.builder = builder;}construct() {this.builder.buildPartA();this.builder.buildPartB();this.builder.buildPartC();}
}// 客户端代码
const concreteBuilder = new ConcreteBuilder();
const director = new Director(concreteBuilder);
const product = concreteBuilder.getResult();
product.show(); // Product Parts:  PartA, PartB, PartC

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

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

相关文章

MySQL系统函数

select version();查看mysql版本。 select user();可以查看数据库用户名。 select database();可以查看数据库名。 select system_use();可以查看系统用户名。 show variables like %basedir%;可以展示数据库读取路径。 show variables like %sets_dir%;可以看一下安…

Linux 下命令行启动与关闭WebLogic的相关服务

WebLogic 的服务器类型 WebLogic提供了三种类型的服务器: 管理服务器节点服务器托管服务器 示例和关系如下图: 对应三类服务器, 就有三种启动和关闭的方式。本篇介绍使用命令行脚本的方式启动和关闭这三种类型的服务器。 关于WebLogic 的…

优维产品最佳实践第17期:善用控制台

「 背 景 」 遇到页面报错时,是不是感到困扰,不知如何解决? 页面响应缓慢时,是否感到迷茫,不清楚从何入手排查? 面对主机高负载时,是不是觉得确认异常根因很有挑战? 本期最佳实践…

主动学习入门Week1

主动学习(Active Learning) 介绍实例详解模型分类基本查询策略经典方法应用方向引用 介绍 主动学习是一种通过主动选择最有价值的样本进行标注的机器学习或人工智能方法。其目的是使用尽可能少的、高质量的样本标注使模型达到尽可能好的性能。也就是说&…

Ant Design Pro初始化报错

今天按照官网步骤初始化项目,第一次报错 fatal: unable to access https://github.com/ant-design/ant-design-pro/: SSL certificate problem: unable to get local issuer certificate 致命:无法访问https://github.com/ant-design/ant-design-pro/&…

12.4_黑马MybatisPlus笔记(下)

目录 11 12 thinking:关于Mybatis Plus中BaseMapper和IService? 13 ​编辑 thinking:CollUtil.isNotEmpty? 14 thinking:Collection、Collections、Collector、Collectors? thinking:groupBy&#…

【Virtual Box】显示界面后无反应

本文记录本人在使用Virtual Box中遇到的问题 1.Virtual Box启动后无反应点击菜单栏是可用的,但界面里的无法操作 【解决方法】:以管理员身份启动virtual Box

数据结构 第5 6 章作业 图 哈希表 西安石油大学

第6章 图 1.选择题 (1)在一个图中,所有顶点的度数之和等于图的边数的( )倍。 A.1/2 B.1 C.2 D.4 答案&#xff1a…

linux 命令 tmux 用法详解

一、tmux 解决的痛点(screen命令一样可以解决,但是tmux功能更强大) 痛点一:大数据传输的漫长一夜 相信做过 Linux 服务运维的同学,都用 scp 进行过服务器间的大文件网络传输。一般这需要很长的时间,这期间…

自动化集成有哪些典型应用场景?

为什么要做自动化场景集成? 主要分为以下几点: 提高效率/减少错误:减少人工操作、人为错误、人力成本,提高生产效率、生产质量和稳定性。 提高可靠性:提高系统的可靠性和稳定性,减少系统故障和停机时间。…

golang使用es,报错Elasticsearch health check failed

今天golang代码里调用es,结果一直报错。报错内容 ElasticsearchRestHealthIndicator : Elasticsearch health check failed然后又去es管理端看,明明节点是绿色的,估计是golang的这个有问题,时间紧迫,我就直接关掉了健…

【网络安全】-《网络安全法》制定背景和核心内容

文章目录 1. 背景介绍1.1 数字时代的崛起1.2 中国网络安全形势 2. 《网络安全法》核心内容2.1 法律适用范围2.2 个人信息保护2.3 关键信息基础设施保护2.4 网络安全监管和应急响应2.5 网络产品和服务安全管理2.6 法律责任和处罚 3. 法律的意义和影响3.1 维护国家安全3.2 保护个…

易石无代码开发:电商平台连接CRM与客服系统,实现营销自动化

易石无代码开发的优势 易石软件以其强大的无代码开发平台,为电商企业提供了一种全新的业务集成手段。在激烈的市场竞争中,电商平台必须不断优化其运营效率和客户服务质量。易石无需复杂的API开发,通过简单的配置就能实现电商平台与CRM、客服…

翻硬币(第四届蓝桥杯省赛C++B组)(java版)

//翻硬币,每次都会改变两个硬币的状态 //因此我们可以从前往后枚举,s1[i] 与 s2[i] 状态不同就改变它的状态 //同时s1[i 1] 与 s2[i 1] 的状态会因此改变 // 所以继续往下枚举s1[i 1] 与 s2[i 1] //因为题目有说必须有解,因此枚举到 n - 1位的时候,两个字符串的…

微软推出AI助手Copilot的正式版本;ChatGPT:七位研究人员分享他们的观点

🦉 AI新闻 🚀 微软推出AI助手Copilot的正式版本 摘要:微软宣布其AI助手Copilot正式上线,此前Copilot的预览版已成为很多用户的日常AI伴侣。此次上线后,Copilot将继续提供AI驱动的网络聊天体验,并具备商业…

Linux:dockerfile编写搭建mysql练习(10)

搭建了httpyum仓库 Dockerfile 主要文件 基于centos基础镜像 centos.repo yum仓库 db_init.sh mysql初始化脚本 run.sh 启动脚本 vim Dockerfile写入FROM centosMAINTAINER teacher lyRUN mkdir /etc/yum.repos.d/bak ; mv /etc/yu…

深入了解Java Period类,对时间段的精确控制

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概2900多字,预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

VBA字典与数组第八讲:数组及数组公式结果的制约性和集合性

《VBA数组与字典方案》教程(10144533)是我推出的第三套教程,目前已经是第二版修订了。这套教程定位于中级,字典是VBA的精华,我要求学员必学。7.1.3.9教程和手册掌握后,可以解决大多数工作中遇到的实际问题。…

Tap虚拟网卡 (草稿)

1 概述 Tap设备通常用于虚拟化场景下,参考如下场景: 图中标注了关键函数,以及数据流向。 tun有两个数据接口, file,给用户态使用;socket,给内核态使用,例如vhost 2 异步处理 图…

IRS辅助的隐蔽通信 (IRS aided covert communication)

这里写自定义目录标题 系统模型与问题formulation系统模型Willie的检测优化问题构建 提出算法A IRS反射矩阵优化Willie的Detection Error Probability (DEP) 本文是论文 Covert Communication in Intelligent Reflecting Surface Assisted Networks With a Friendly Jammer 的阅…