设计模式-基础篇(创建型-建造者模式)

发布时间:2026/8/27 9:27:41

设计模式-基础篇(创建型-建造者模式)
这一篇带大家了解一下建造者模式。有兴趣可以翻一下前面的我写的其他设计模式如果堆设计模式不了解可以先看看设计模式的六大原则。设计模式-基础篇六大原则设计模式-基础篇创建型:单例模式设计模式-基础篇(创建型:工厂)建造者模式是一种创建型模式主要用来将一个复杂对象的创建过程拆分成一个个小步骤。一步步构建出来。为什么使用建造者模式对象构建过程复杂如果创建的对象有很多的步骤或者参数。直接在构造函数或者方法参数中传递就会显得非常复杂。而建造者模式就能将这些复杂的过程拆分开。使得对象的创建过程变得清晰。需要灵活的构建方式根据需求的不同构建相似的对象建造者允许我们更改某些步骤创建出不同的对象。构建过程与表示进行分离一个构建过程创建出不同表示的对象。什么场景下下可以使用建造者模式复杂表单或者请求对象的构建订单提交时可以使用建造者避免参数过长或者参数顺序错乱。导出文件内容构建导出pdf页眉表格图片段落这些可以使用。建造者的基本结构产品类 要构建的复杂对象抽象建造者类构建产品的方法以及返回产品的方法具体建造者类负责各部分的构建细节实现builder。指挥者屏蔽构建过程的细节指挥建造者去构建产品。客户端发起建造请求选择具体的建造者并交给指挥者进行构建。建造者模式的优点结构清晰过程可控。便于构建不同版本的对象不同的建造者可以构建结构类似配置不同的对象。代码容易扩展后续新增构建步骤也以继续增加。建造者模式的缺点增加类的数量额外引入了建造者类和指挥者类。不适合构建差异太大的对象适用于有共同构建步骤的对象对过对象的构建逻辑不一样就会显得臃肿。Jdk的StringBuilder() 方法就是一个建造者模式stf时指挥者append方法是具体建造者而tostring则是结果的返回。代码演示创建一个导出pdf的产品类。importjava.util.ArrayList;importjava.util.List;/** * 产品角色PDF文档实体存放标题、段落、图片 */publicclassPdfDocument{//标题privateStringtitle;//段落文本集合privateListStringparagraphListnewArrayList();//图片路径集合模拟图片privateListStringimageListnewArrayList();publicvoidsetTitle(Stringtitle){this.titletitle;}publicvoidaddParagraph(Stringcontent){paragraphList.add(content);}publicvoidaddImage(StringimagePath){imageList.add(imagePath);}//模拟输出PDF文档内容实际项目这里调用PDF工具生成文件publicvoidshowDocumentInfo(){System.out.println(生成PDF文档);System.out.println(文档标题title);System.out.println(段落内容);paragraphList.forEach(p-System.out.println(\tp));System.out.println(插入图片路径);imageList.forEach(img-System.out.println(\timg));System.out.println(\n);}}定义抽象建造者和具体建造者。/** * 抽象建造者定义构建PDF各个组件的统一方法 */publicabstractclassPdfBuilder{protectedPdfDocumentpdfDocument;//初始化产品publicvoidcreateNewPdf(){pdfDocumentnewPdfDocument();}//构建标题publicabstractvoidbuildTitle(Stringtitle);//构建段落publicabstractvoidbuildParagraph(Stringparagraph);//构建图片publicabstractvoidbuildImage(StringimagePath);//获取最终成品publicabstractPdfDocumentgetResult();}/** * 具体建造者实现抽象建造者组装PDF各个部件 */publicclassCustomPdfBuilderextendsPdfBuilder{OverridepublicvoidbuildTitle(Stringtitle){pdfDocument.setTitle(title);}OverridepublicvoidbuildParagraph(Stringparagraph){pdfDocument.addParagraph(paragraph);}OverridepublicvoidbuildImage(StringimagePath){pdfDocument.addImage(imagePath);}OverridepublicPdfDocumentgetResult(){returnpdfDocument;}}由指挥者进行调度。/** * 指挥者编排PDF文档构建步骤控制组装顺序 */publicclassPdfDirector{/** * 指挥构建完整PDF文档 * param builder 建造者 * param title 标题 * param paragraphs 多个段落 * param images 多张图片路径 * return 组装完成PDF文档 */publicPdfDocumentconstruct(PdfBuilderbuilder,Stringtitle,ListStringparagraphs,ListStringimages){//1.创建空白PDFbuilder.createNewPdf();//2.设置标题builder.buildTitle(title);//3.循环添加段落for(Stringpara:paragraphs){builder.buildParagraph(para);}//4.循环添加图片for(Stringimg:images){builder.buildImage(img);}//5.返回成品PDFreturnbuilder.getResult();}}测试用例importjava.util.List;publicclassClientDemo{publicstaticvoidmain(String[]args){//1.创建具体建造者PdfBuilderpdfBuildernewCustomPdfBuilder();//2.创建指挥者PdfDirectordirectornewPdfDirector();//模拟业务数据Stringtitle2026年度数据报告;ListStringparagraphsList.of(第一部分全年业务总体概况,第二部分各部门指标完成情况,第三部分下一年工作计划);ListStringimagesList.of(/data/img/chart1.png,/data/img/chart2.png);//指挥者指挥建造客户端只传入数据不关心内部组装步骤PdfDocumentpdfDocumentdirector.construct(pdfBuilder,title,paragraphs,images);//输出最终PDFpdfDocument.showDocumentInfo();}}很多场景可以省略掉指挥者直接将指挥者逻辑写在客户端如下省略到指挥者我们日常开发也是这样。importjava.util.List;publicclassClientDemo{publicstaticvoidmain(String[]args){//1.创建具体建造者PdfBuilderbuildernewCustomPdfBuilder();//模拟业务数据Stringtitle2026年度数据报告;ListStringparagraphsList.of(第一部分全年业务总体概况,第二部分各部门指标完成情况,第三部分下一年工作计划);ListStringimagesList.of(/data/img/chart1.png,/data/img/chart2.png);//1.创建空白PDFbuilder.createNewPdf();//2.设置标题builder.buildTitle(title);//3.循环添加段落for(Stringpara:paragraphs){builder.buildParagraph(para);}//4.循环添加图片for(Stringimg:images){builder.buildImage(img);}//5.返回成品PDFbuilder.getResult();//输出最终PDFpdfDocument.showDocumentInfo();}}这样可以达到相同效果算是建造者模式的变种省略了一个类。

相关新闻

MATLAB求解NP-hard问题的工程化实战指南

MATLAB求解NP-hard问题的工程化实战指南

2026/8/27 9:27:41

1. 这不是理论推导课,是数模竞赛里真刀真枪干出来的NP-hard解法 你打开MATLAB,敲下 optimproblem ,准备建模——结果发现目标函数里嵌套着一个无法线性化的组合逻辑;你调用 intlinprog ,等了17分钟,求解…

Verilog可回看秒表:FPGA时序调试的轻量级逻辑分析仪

Verilog可回看秒表:FPGA时序调试的轻量级逻辑分析仪

2026/8/27 9:17:40

1. 这不是普通秒表:一个能“倒带回看”的数字计时器到底在解决什么问题? 你有没有遇到过这样的场景:在FPGA实验课上调试一个运动控制模块,需要精确测量某段PWM波形的高电平持续时间;或者在做电机堵转保护逻辑验证时&am…

算法竞赛中地图绘制问题的抽象建模与核心解法

算法竞赛中地图绘制问题的抽象建模与核心解法

2026/8/27 9:17:40

1. 项目概述:从一道算法题看地图绘制的抽象与实现 最近在整理蓝桥杯的备赛资料,翻到了第十四届集训里的一道题,ALGO-380 “绘制地图”。乍一看标题,很多刚接触算法竞赛的同学可能会有点懵,觉得这像是个图形学或者GUI编…

免费网盘直链下载工具:LinkSwift 支持 8 大网盘

免费网盘直链下载工具:LinkSwift 支持 8 大网盘

2026/8/27 12:07:58

免费网盘直链下载工具:LinkSwift 支持 8 大网盘 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 /…

单片机毕设选题推荐:基于 STM32 的水质参数阈值可调监测终端设计 基于 STM32 的水体温质一体化检测报警系统设计(011005)

单片机毕设选题推荐:基于 STM32 的水质参数阈值可调监测终端设计 基于 STM32 的水体温质一体化检测报警系统设计(011005)

2026/8/27 12:07:58

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

【2015-01-04】《C缺陷与陷阱》翻书笔记:有符号整数还是无符号整数

【2015-01-04】《C缺陷与陷阱》翻书笔记:有符号整数还是无符号整数

2026/8/27 12:07:58

[历史归档] 本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。 发布时间: 2015-01-04 | 标题:《C缺陷与陷阱》翻书笔记:有符号整数还是无符号整数 | 分类: 编…

算法面试题汇总

算法面试题汇总

2026/8/27 12:07:58

1.证明链表中存在环两个指针一个单步前进,一个两步前进,会重合的话证明有环(O(N)) 2.找出上述链表环的位置从头出发到环入口的距离 等于 从第一次相遇点继续走到环入口的距离,从两根指针分别从链头和相遇点出发&#x…

【2015-01-10】ubuntu下使用QT阅读linux源码

【2015-01-10】ubuntu下使用QT阅读linux源码

2026/8/27 12:07:58

[历史归档] 本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。 发布时间: 2015-01-10 | 标题:ubuntu下使用QT阅读linux源码 | 分类: 编程 / 操作系统 / linux / kernel …

基于python的环卫管理系统的设计与实现(源码+lw+部署文档+讲解等)

基于python的环卫管理系统的设计与实现(源码+lw+部署文档+讲解等)

2026/8/27 11:57:57

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…