当前位置: 首页 > news >正文

生成器设计模式(Builder Design Pattern)[论点:概念、图示、示例、框架中的应用、场景]

文章目录

  • 概念
  • 相关图示
  • 代码示例
  • 框架中的应用
  • 场景
    • 多个生成器(Concrete Builder):
    • 单个生成器

概念

        生成器设计模式(Builder Design Pattern)是一种创建型设计模式,用于处理具有多个属性和复杂构造过程的对象。生成器模式通过将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。这有助于减少构造函数的参数个数,提高代码的可读性和可维护性。

生成器模式的核心组件包括:

  1. 产品(Product):需要创建的复杂对象。
  2. 抽象生成器(Builder):定义用于创建产品对象各个部分的接口。
  3. 具体生成器(Concrete Builder):实现抽象生成器接口,负责创建和组装产品的各个部分。
  4. 指挥者(Director):负责构建产品的过程,通常接受一个生成器对象作为参数,并使用该对象的方法来组装产品。

相关图示

在这里插入图片描述

代码示例

// 产品
class House {private String foundation;private String structure;private String roof;public void setFoundation(String foundation) {this.foundation = foundation;}public void setStructure(String structure) {this.structure = structure;}public void setRoof(String roof) {this.roof = roof;}public String toString() {return "Foundation: " + foundation + ", Structure: " + structure + ", Roof: " + roof;}
}// 抽象生成器
interface HouseBuilder {void buildFoundation();void buildStructure();void buildRoof();House getHouse();
}// 具体生成器
class ConcreteHouseBuilder implements HouseBuilder {private House house;public ConcreteHouseBuilder() {house = new House();}@Overridepublic void buildFoundation() {house.setFoundation("Concrete Foundation");}@Overridepublic void buildStructure() {house.setStructure("Concrete Structure");}@Overridepublic void buildRoof() {house.setRoof("Concrete Roof");}@Overridepublic House getHouse() {return house;}
}// 指挥者
class HouseDirector {public House constructHouse(HouseBuilder builder) {builder.buildFoundation();builder.buildStructure();builder.buildRoof();return builder.getHouse();}
}// 客户端
public class BuilderPatternDemo {public static void main(String[] args) {HouseBuilder builder = new ConcreteHouseBuilder();HouseDirector director = new HouseDirector();House house = director.constructHouse(builder);System.out.println(house);}
}

框架中的应用

        Spring Boot中的生成器设计模式的一个很好的例子是org.springframework.boot.web.client.RestTemplateBuilder。这个生成器类可以帮助创建和配置RestTemplate实例。使用RestTemplateBuilder可以简化和优化RestTemplate的创建过程,尤其是当有多个配置选项时。

public class RestTemplateBuilder {//下面展示部分相关代码private Duration connectTimeout;private Duration readTimeout;private ClientHttpRequestFactory requestFactory;public RestTemplateBuilder() {}public RestTemplateBuilder connectTimeout(Duration connectTimeout) {this.connectTimeout = connectTimeout;return this;}public RestTemplateBuilder readTimeout(Duration readTimeout) {this.readTimeout = readTimeout;return this;}public RestTemplateBuilder requestFactory(ClientHttpRequestFactory requestFactory) {this.requestFactory = requestFactory;return this;}public RestTemplate build() {SimpleClientHttpRequestFactory requestFactory = this.requestFactory == null ? new SimpleClientHttpRequestFactory() : (SimpleClientHttpRequestFactory) this.requestFactory;if (this.connectTimeout != null) {requestFactory.setConnectTimeout((int) this.connectTimeout.toMillis());}if (this.readTimeout != null) {requestFactory.setReadTimeout((int) this.readTimeout.toMillis());}return new RestTemplate(requestFactory);}
}

场景

生成器设计模式在不同场景下可能有不同的应用方式。以下是两种典型的场景

多个生成器(Concrete Builder):

        当需要为同一产品(Product)提供不同的表示形式或构建过程时,可以使用多个生成器。每个生成器负责创建并组装产品的各个部分,但可能采用不同的配置、数据源或构建方法。

        例如,假设有一个Report类,它需要根据不同的数据源(如CSV文件、数据库等)以及不同的格式(如HTML、PDF等)生成报告。在这种情况下,可以创建多个生成器,每个生成器负责从特定的数据源中读取数据并生成特定格式的报告。

interface ReportBuilder {void loadDataSource();void buildHeader();void buildContent();void buildFooter();Report getReport();
}class CSVToHtmlReportBuilder implements ReportBuilder {// ...实现里面对应的方法
}class DatabaseToPdfReportBuilder implements ReportBuilder {// ...实现里面对应的方法
}

单个生成器

        当一个复杂对象的变化仅仅是属性值的变化,而不涉及到整体结构的变化时,只需要一个生成者。在这种情况下,生成者可以通过扩展属性和填充属性的方法来创建具有不同属性值的复杂对象。

        例如,假设我们正在构建一个汽车制造系统,系统可以生产不同颜色、轮胎类型和发动机类型的汽车。在这种情况下,我们可以使用一个汽车生成者,并通过提供不同的颜色、轮胎类型和发动机类型来创建具有不同属性的汽车。

public class Car {private String color;private String tireType;private String engineType;public void setColor(String color) {this.color = color;}public void setTireType(String tireType) {this.tireType = tireType;}public void setEngineType(String engineType) {this.engineType = engineType;}@Overridepublic String toString() {return "Car{" +"color='" + color + '\'' +", tireType='" + tireType + '\'' +", engineType='" + engineType + '\'' +'}';}
}public class CarBuilder {private Car car;public CarBuilder() {car = new Car();}public CarBuilder setColor(String color) {car.setColor(color);return this;}public CarBuilder setTireType(String tireType) {car.setTireType(tireType);return this;}public CarBuilder setEngineType(String engineType) {car.setEngineType(engineType);return this;}public Car build() {return car;}
}public class Main {public static void main(String[] args) {CarBuilder carBuilder = new CarBuilder();Car sportsCar = carBuilder.setColor("Red").setTireType("Sports").setEngineType("V8").build();Car familyCar = carBuilder.setColor("Blue").setTireType("Standard").setEngineType("V6").build();System.out.println(sportsCar);System.out.println(familyCar);}
}

相关文章:

生成器设计模式(Builder Design Pattern)[论点:概念、图示、示例、框架中的应用、场景]

文章目录概念相关图示代码示例框架中的应用场景多个生成器(Concrete Builder):单个生成器概念 生成器设计模式(Builder Design Pattern)是一种创建型设计模式,用于处理具有多个属性和复杂构造过程的对象。生…...

JUC并发工具

JUC并发工具 一、CountDownLatch应用&源码分析 1.1 CountDownLatch介绍 CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。 如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。 需要一个并发安全的计数器来操作。 CountDown…...

java面试题-基础问题-如何理解Java中的多态?

如何理解Java中的多态?如何理解Java中的多态?典型回答扩展知识方法的重载与重写重载和重写的区别如何理解Java中的多态? 典型回答 多态的概念比较简单,就是同一操作作用于不同的对象,可以有不同的解释,产…...

03.vue3的计算属性

文章目录1.计算属性1.get()和set()2.computed的简写3.computed和methods对比2.相关demo1.全选和反选2.todos列表1.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。所以,对于任何…...

Ceph性能调优

1. 最佳实践 1.1 基本 监控节点对于集群的正确运行非常重要,应当为其分配独立的硬件资源。如果跨数据中心部署,监控节点应该分散在不同数据中心或者可用性区域日志可能会让集群的吞吐量减半。理想情况下,应该在不同磁盘上运行操作系统、OSD…...

机器学习-问答题准备(英文)-更新中

第一章 入门 How would you define Machine Learning? Machine Learning is about building systems that can learn from data. Learning means getting better at some task, given some performance measure. Can you name four types of problems where it shines? To r…...

展示演示软件设计制作(C语言)

展示演示软件设计制作 所谓展示演示软件就像是PPT那样的东西。PPT是幻灯片式的展示,而我设计的软件是多媒体的,多样展示方法的,多种功能的。可以扩展为产品展示,项目介绍,景点导游,多媒体授课,…...

Android 自定义view 入门 案例

自定义一个圆环进度条: 1.首页Android Studio创建一个项目 2.在项目src/xxx/目录下右键选择创建一个自定义view页面:new->UICompoent->customer view 3.输入自定义名称,选择开发语言 4.确定之后,自动生成3个文件一个是&…...

[imangazaliev/didom]一个简单又快速的DOM操作库

DiDOM是一个功能齐全、易于使用和高性能的解析器和操作库,可以帮助PHP开发者更加高效地处理HTML文档。 为了更好地了解这个项目,我们先来看看下面的介绍。 安装 你可以使用composer来安装DiDOM,只需要在你的项目目录下执行下面的命令&…...

Cookie和Session的工作流程及区别(附代码案例)

目录 一、 HTTP协议 1.1 为什么HTTP协议是无状态的? 1.2 在HTTP协议中流式传输和分块传输编码的区别 二、Cookie和Session 2.1 Cookie 2.2 Session 2.3 Cookie和Session的区别 三、servlet中与Cookie和Session相关的API 3.1 HttpServletRequest 类中的相关方…...

适用于高级别自动驾驶的驾驶员可预见误用仿真测试

摘要 借助高级别自动驾驶(HAD),驾驶员可以从事与驾驶无关的任务。在系统出现失效的情况下,驾驶员应该合理地重新获得对自动驾驶车辆(AV)的控制。不正确的系统理解可能会引起驾驶员的误操作,并可能导致车辆级的危害。ISO 21448预期功能安全标…...

Linux之进程知识点

一、什么是进程 进程是一个运行起来的程序。 问题思考: ❓ 思考:程序是文件吗? 是!都读到这一章了,这种问题都无需思考!文件在磁盘哈。 本章一开始讲的冯诺依曼,磁盘就是外设,和内…...

一种供水系统物联网监测系统

1.1供水系统 1.1.1监测范围选择依据 (1)管网老化区域管网 管网建设年代久远,通常管网发生破损问题较大,根据管网本身属性和历史发生事件的统计分析,结合数理统计,优先选择管网老化区域的管段所在区域进行…...

Linux驱动开发——字符设备(2)

目录 虚拟串口设备驱动 一个驱动支持多个设备 习题 虚拟串口设备驱动 字符设备驱动除了前面搭建好代码的框架外,接下来最重要的就是要实现特定于设备的操作方法,这是驱动的核心和关键所在,是一个驱动区别于其他驱动的本质所在,…...

【MySQL数据库原理】MySQL Community安装与配置

目录 安装成功之后查看版本验证1、介绍、安装与配置数据库2、操作MySQL数据库3、MySQL数据库原理安装成功之后查看版本验证 SELECT VERSION();查看mysql版本号 1、介绍、安装与配置数据库 下载安装包:https://download.csdn.net/download/weixin_41194129/87672588 MySQL…...

【ROS参数服务器增删改c++操作1】

需求:实现参数服务器参数的增删改查操作。 在C中实现参数服务器数据的增删改查,可以通过两套API实现:. ros::NodeHandle ros::param下面为具体操作演示: 在src下面的自己定义的作用包下面新建文件。 比如我的是一直存在的demo03_ws文件下的src里面&…...

elasticsearch 常用数据类型详解和范例

主要内容 elasticsearch 中的字符串(keyword)类型 的详解和范例 elasticsearch 中的字符串/文本(text)类型 的详解和范例 elasticsearch 中的数字(数值)类型 的详解和范例 elasticsearch 中的布尔&#…...

力扣119杨辉三角 II:代码实现 + 方法总结(数学规律法 记忆法/备忘录)

文章目录第一部分:题目第二部分:解法①-数学规律法2.1 规律分析2.2 代码实现2.3 需要思考第三部分:解法②-记忆法(备忘录)第四部分:对比总结第一部分:题目 🏠 链接:119.…...

安装pandas遇到No module named ‘_bz2’ 的解决方案

出现这个问题我们可以按照这篇博客去解决: https://blog.csdn.net/bf96163/article/details/128654915 如果解决不了,可以这样去做: 1.确保安装了 对应的库 // ubuntu安装命令 sudo apt-get install bzip2-devel // centos安装命令 sudo y…...

【数据治理-05】什么数据才是货真价实的数据资产,一起聊聊数据资产

在国家层面一些列文件、纲要、政策、办法等政府力量的推动下,数据资产这个词越来越频繁的出现在我们寻常工作当中,现在越来越觉得这个词被滥用,大有“一切数据皆是资产”的感觉,业务数据是资产、技术数据是资产,不能共…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

Robots.txt 文件

什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

2023赣州旅游投资集团

单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...