设计模式之建造者模式精讲

也叫生成器模式。将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

在建造者模式中,有如下4个角色:

  • 抽象建造者(Builder):用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑。
  • 具体建造者(Concrete Builder):实现抽象建造者的所有方法,并返回一个组建好的产品实例(Product)。
  • 产品(Product):建造中的对象,一个系统会有多于一个的产品类,这些产品不一定有共同的接口,可以是不相关的。
  • 导演(Director):该角色负责安排已有模块的顺序,指导Builder的建造过程,可以有多个Director角色。

我们通过一个生产不同品牌电脑的例子来加深理解:

public abstract class Computer {protected String cpu;protected String band;public abstract void assemble();
}public class DellComputer extends Computer {@Overridepublic void assemble() {this.band = "Dell";}
}public class HpComputer extends Computer {@Overridepublic void assemble() {this.band = "Hp";}
}public abstract class AbstractBuilder {protected Computer computer;public abstract void setCpu();public abstract Computer build();
}public class DellBuilder extends AbstractBuilder {public DellBuilder() {this.computer = new DellComputer();}@Overridepublic void setCpu() {this.computer.cpu = "intel";}@Overridepublic Computer build() {this.computer.assemble();return this.computer;}
}public class HpBuilder extends AbstractBuilder {public HpBuilder() {this.computer = new HpComputer();}@Overridepublic void setCpu() {this.computer.cpu = "intel";}@Overridepublic Computer build() {this.computer.assemble();return this.computer;}
}public class Director {private AbstractBuilder builder;public Director(AbstractBuilder builder) {this.builder = builder;}public Computer create() {builder.setCpu();return builder.build();}
}

大家如果需要视频版本的讲解,可以关注下我的B站:

五、设计模式之建造者模式精讲

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

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

相关文章

c++使用类的一些注意事项

前言: 本篇内容为前面的补充,介绍了我们使用类时需要注意些什么以及一些编译器的优化,可能有些理解不到位或者错误,请斧正。 目录 前言: 1.再谈构造函数 2.(c98)隐式类型转换中的编译器的优…

【BlossomRPC】服务暴露与发现

文章目录 RPC项目 配置中心项目 网关项目 与传统RPC框架一样,我们需要保证我们的服务是能被发现的。 也就是说,我希望通过一种简单的方式,就能将我们的服务暴露出去,使得其他服务可以方便的去依赖这个服务。 因此,我…

Codeforces Round 934 (Div. 2) D. Non-Palindromic Substring

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

JavaScript如何制作轮播图

在JavaScript中实现轮播图可以通过多种方式&#xff0c;但最常见的方式是使用数组来存储图片&#xff0c;然后使用setInterval函数定期更改显示的图片。下面是一个简单的例子&#xff1a; 首先&#xff0c;你需要在HTML中设置一些用于显示图片的<img>标签&#xff0c;以…

【初阶数据结构】——牛客:CM11 链表分割

文章目录 1. 题目介绍2. 思路分析3. 代码实现 1. 题目介绍 链接: link 这道题是给我们一个链表和一个值X &#xff0c;要求我们以给定值x为基准将链表分割成两部分&#xff0c;所有小于x的结点排在大于或等于x的结点之前。 最终返回重新排列之后的链表的头指针。 2. 思路分析…

用WHERE命令可以在命令行搜索文件

文章目录 用WHERE命令可以在命令行搜索文件概述笔记没用的小程序END 用WHERE命令可以在命令行搜索文件 概述 想确认PATH变量中是否存在某个指定的程序(具体是在PATH环境变量中给出的哪个路径底下?). 开始不知道windows有where这个命令, 还自己花了2个小时写了一个小程序. 后…

Redis 的慢日志

Redis 的慢日志 Redis 的慢日志&#xff08;Slow Log&#xff09;是用于记录执行时间超过预设阈值的命令请求的系统。慢日志可以帮助运维人员和开发人员识别潜在的性能瓶颈&#xff0c;定位那些可能导致 Redis 性能下降或响应延迟的慢查询。以下是 Redis 慢日志的相关细节&…

hcip综合实验2

目录 实验拓扑&#xff1a; 实验要求&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 1.配置设备接口IP 2.通过配置缺省路由让公网互通 3.配置ppp 1.R1和R5间的ppp的PAP认证&#xff1b; 2.R2与R5之间的ppp的CHAP认证; 3. R3与R5之间的HDLC封装; 4.构建R1、…

K8S故障处理指南:pod驱逐问题处理

更多技术博客,请关注微信公众号:运维之美 在K8S集群故障处理过程中,你可能遇到过pod的各种状态,Evicted状态代表你的K8S环境遇到了资源驱逐的问题,本节通过对驱逐问题的解决,参数的调整,问题的处理思路,希望给你解决此类问题提供帮助。 一、pod驱逐问题 pod出现状态为…

鸽巢原理,也被称为抽屉原理或鸽笼原理

鸽巢原理&#xff0c;也被称为抽屉原理或鸽笼原理&#xff0c;是数学中一种非常重要的基本原理。它的表述虽然简单&#xff0c;但应用范围却极其广泛&#xff0c;无论是在理论数学还是在实际应用中&#xff0c;鸽巢原理都发挥着不可替代的作用。 一、鸽巢原理的基本定义与表述…

如何系统的自学python?

系统地自学Python是一个循序渐进的过程&#xff0c;以下是一份详细的指南&#xff0c;帮助你从零开始逐步掌握这门语言&#xff1a; 1、了解Python及其应用场景&#xff1a; 阅读关于Python的简介&#xff0c;理解它为何流行&#xff0c;以及在哪些领域&#xff08;如Web开发…

【华为OD机试】剩余银饰的重量【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 有 N 块二手市场收集的银饰,每块银饰的重量都是正整数,收集到的银饰会被熔化用于打造新的饰品。 每一回合,从中选出三块 最重的 银饰,然后一起熔掉。假设银饰的重量分别为 x 、y 和 z…

GitHub | Pages 部署 Vue 项目但页面空白,报错:net::ERR_ABORTED 404 (Not Found)

目录 报错信息 解决方法 报错信息 如下所示&#xff08;地址已盲&#xff09;&#xff1a; 控制台报错说找不到这些资源&#xff0c;但是 dist 目录下都有这些 JS 文件啊&#xff0c;这是为什么&#xff1f; 解决方法 在 Vue 项目的 vue.config.js 文件中&#xff0c;添加 …

FANUC机器人故障诊断—报警代码更新(三)

FANUC机器人故障诊断中&#xff0c;有些报警代码&#xff0c;继续更新如下。 一、报警代码&#xff08;SRVO-348&#xff09; SRVO-348DCS MCC关闭报警a&#xff0c;b [原因]向电磁接触器发出了关闭指令&#xff0c;而电磁接触器尚未关闭。 [对策] 1.当急停单元上连接了CRMA…

pytorch | yolov5 Can not get arrribute SiLU

【报错】 Can‘t get attribute ‘SiLU‘ on &#xff1c;module ‘torch.nn.modules.activation 【解决方法】 将SiLU拷贝到~/.local/lib/python3.8/site-packages/torch/nn/modules/activation.py文件中 class SiLU(Module): # export-friendly version of nn.SiLU()stati…

【JVM】JVM常用性能调优参数详细介绍

JVM常用性能调优参数详细介绍 一、何时进行JVM调优二、性能调优三、JVM调优的基本原则四、JVM调优目标五、JVM调优的步骤六、JVM参数七、JVM参数解析及调优八、JVM参数使用手册8.1 内存相关8.2 GC策略相关8.3 GC日志相关8.4 异常相关8.5 问题定位及优化相关九、参考文档一、何时…

在ROS上快速验证PID算法

在ROS上快速验证PID算法 前言 最近有在外面出差授课的工作任务&#xff0c;其中有一个环节是给大家讲述PID相关的内容&#xff0c;在制作相关PPT的时候查询了很多资料&#xff0c;但是写着写着突然意识到一个问题&#xff0c;PID已经在控制专业学习过程以及工程开发时间中那么…

Electron 读取本地配置 增加缩放功能(ctrl+scroll)

最近&#xff0c;一个之前做的electron桌面应用&#xff0c;需要增加两个功能&#xff1b;第一是读取本地的配置文件&#xff0c;然后记载配置文件中的ip地址&#xff1b;第二就是增加缩放功能&#xff1b; 第一&#xff0c;配置本地文件 首先需要在vue工程根目录中&#xff0…

创建第一个51文件

1.找一个文件目录创建一个main.c 比如我的 F:\my_project\project_of_51\0.first_of_51 什么你不会&#xff1f; 先把这里的文件扩展名打开; 再创建一个文本文件&#xff0c;重新命名为main.c // 修改.c 后弹出一个确认修改的框&#xff0c;选确认即可 2.kei操作: 1&#xf…

与鲸同行,智领未来!和鲸科技“人工智能+X”学科建设合作交流会(北京站)圆满结束!

在国家加快发展新质生产力的大背景下&#xff0c;3月25日下午&#xff0c;和鲸科技 2024 年“人工智能X”学科建设合作交流会&#xff08;北京站&#xff09;暨“AIX”实验室建设与供应商选型座谈会顺利召开。为提供更为集中和专业的讨论环境&#xff0c;本次会议特别采取闭门审…