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

软考 系统架构设计师系列知识点 —— 设计模式之创建者模式

本文内容参考:

软考 系统架构设计师系列知识点之设计模式(2)_系统架构设计师中考设计模式吗-CSDN博客

创建者模式_百度百科

建造者模式_百度百科

https://zhuanlan.zhihu.com/p/551870461

特此致谢!

Builder Pattern(创建者模式)

1. 概述

创建者模式,又称为构建者模式、建造者模式、构建器模式、生成器模式,英文名称(统一)为Builder Pattern。创建者模式是23种设计模式之一。其核心思想是:将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。

更为直观简要地说,创建者将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2. 实现原理

创建者模式能够分步骤创建复杂对象,允许使用相同的创建代码生成不同类型和形式的对象。

创建者模式所构建的对象一定是庞大而复杂的,并且一定是按照既定的制造工序将组件组装起来的,例如计算机、汽车、建筑物等。通常将负责构建这些大型对象的工程师称为建造者。

建造者模式又称为生成器模式,主要用于对复杂对象的构建、初始化,它可以将多个简单的组件对象按顺序一步步组装起来,最终构建成一个复杂的成品对象。

与工厂系列模式不同的是,建造者模式的主要目的在于把烦琐的构建过程从不同对象中抽离出来,使其脱离并独立于产品类与工厂类,最终实现用同一套标准的制造工序能够产出不同的产品。

3. 角色

创建者模式主要由五个部分构成:组装类、抽象创建者类、实现抽象创建者类的具体创建者类(ConcreateBuilder)、抽象产品和实现抽象产品的具体产品类。

  • Builder

为创建一个产品对象的各个部件指定抽象接口。

  • ConcreteBuilder

实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

  • Director

构造一个使用Builder接口的对象。

  • Product

表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

4. 代码举例

  • Builder
public interface PersonBuilder {void buildHead();void buildBody();void buildFoot();Person buildPerson();
}

  • ConcreteBuilder
public class ManBuilder implements PersonBuilder {Person person;public ManBuilder() {person = new Person();}public void buildbody() {person.setBody("建造男人的身体");}public void buildFoot() {person.setFoot("建造男人的脚");}public void buildHead() {person.setHead("建造男人的头");}public Person buildPerson() {return person;}
}

  • Director
public class PersonDirector {public Person constructPerson(PersonBuilder pb) {pb.buildHead();pb.buildBody();pb.buildFoot();return pb.buildPerson();}
}

  • Product
public class Person {private String head;private String body;private String foot;public String getHead() {return head;}public void setHead(String head) {this.head = head;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}public String getFoot() {return foot;}public void setFoot(String foot) {this.foot = foot;}
}public class Man extends Person {
}

测试代码:

public class Test{public static void main(String[] args) {PersonDirector pd = new PersonDirector();Person person = pd.constructPerson(new ManBuilder());System.out.println(person.getBody());System.out.println(person.getFoot());System.out.println(person.getHead());}
}

相关文章:

软考 系统架构设计师系列知识点 —— 设计模式之创建者模式

本文内容参考: 软考 系统架构设计师系列知识点之设计模式(2)_系统架构设计师中考设计模式吗-CSDN博客 创建者模式_百度百科 建造者模式_百度百科 https://zhuanlan.zhihu.com/p/551870461 特此致谢! Builder Pattern&#xf…...

oracle判断同表同条件查出两条数据,根据长短判断差异

目标:同一个物料,账套不同,排查同料号有差异的规格名称 在Oracle数据库中,如果你想查询同一张表中两条数据某个字段的长度不同的情况,你可以使用JOIN语句或者窗口函数(如ROW_NUMBER()、RANK()、DENSE_RANK…...

咋用fliki的AI生成各类视频?AI生成视频教程

最近想制作视频,多方考查了决定用fliki,于是订阅了一年试试,这个AI生成的视频效果来看真是不错,感兴趣的自己官网注册个账号体验一下就知道了。 fliki官网 Fliki生成视频教程 创建账户并登录 首先,访问fliki官网并注…...

【STM32-代码】

STM32-代码 ■ printf() 输出到uart1■■■ ■ printf() 输出到uart1 static UART_HandleTypeDef * g_HDebugUART &huart1;int fputc(int c, FILE *f) {(void)f;HAL_UART_Transmit(g_HDebugUART, (const uint8_t *)&c, 1, DEBUG_UART_TIMEOUT);return c; }int fgetc…...

用cursor三个小时复刻高德地图的足迹地图

用cursor三个小时复刻了高德地图的足迹地图,当然,是“低配”版的。 1、首先要初始化,提出一个需求,让它自由发挥 运行之后发现它报错了,原因出在这行代码,“https://cdn.jsdelivr.net/npm/echarts5,4.3/…...

Git分支管理与工作流实践

Git分支管理与工作流实践 一、Git分支规范与核心原则 主分支(master/main) 核心作用:存储生产环境代码,永远保持稳定且可直接发布。禁止直接在此分支开发。操作规范:仅通过合并release或hotfix分支更新,合…...

python面试总结

目录 Python基础 1、python及其特点 2、动态类型和静态类型? 3、变量命名规则是什么? 4、基本数据类型有哪些? 5、Python 中字典? 6、集合set是什么?有什么特点? 7、python的字符串格式化 函数 1…...

基于骨骼识别的危险动作报警系统设计与实现

基于骨骼识别的危险动作报警系统设计与实现 基于骨骼识别的危险动作报警分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】基于骨骼识别算法的实时危险行为预警方案 【技术栈】 ①:系统环境:Windows 10…...

HarmonyOS 5.0应用开发——五子棋游戏(鸿蒙版)开发

【高心星出品】 文章目录 五子棋游戏(鸿蒙版)开发运行效果开发步骤项目结构核心代码棋盘组件:游戏逻辑处理:主页面: 五子棋游戏(鸿蒙版)开发 五子棋是一款传统的两人策略型棋类游戏&#xff0…...

避坑,app 播放器media:MediaElement paly报错

System.Runtime.InteropServices.COMException HResult=0x8001010E Message= Source=WinRT.Runtime StackTrace: 在 WinRT.ExceptionHelpers.<ThrowExceptionForHR>g__Throw|38_0(Int32 hr) 在 ABI.Microsoft.UI.Xaml.Controls.IMediaPlayerElementMethods.get_MediaPlay…...

STM32单片机入门学习——第38节: [11-3] 软件SPI读写W25Q64

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.16 STM32开发板学习——第一节&#xff1a; [1-1]课程简介 前言开发板说明引用解答和…...

使用阿里云创建公司官网(使用wordpress)

安装 LNMP 不通的lnmp版本 https://lnmp.org/download.html wget http://soft.vpser.net/lnmp/lnmp2.1.tar.gz -cO lnmp2.1.tar.gztar zxf lnmp2.1.tar.gz && cd lnmp2.1 && ./install.sh lnmp数据库选5.7 选好数据库&#xff0c;会让你设置数据库 root 用户…...

Python程序结构深度解析:顺序结构与对象布尔值的底层逻辑与应用

一、程序结构的三大基石 在计算机科学领域&#xff0c;任何复杂的算法都可以分解为顺序结构、选择结构和循环结构这三种基本结构的组合。这种结构化编程思想由计算机科学家Bhm和Jacopini在1966年首次提出&#xff0c;至今仍是现代编程语言设计的核心原则。 1.1 顺序结构的本质…...

【系统搭建】Ubuntu系统两节点间SSH免密配置

SSH免密配置是MPI分布式、DPDK通信等集群节点间通信的基础配置 1. 安装SSH服务端&#xff08;所有节点执行&#xff09; Ubuntu 默认只安装 SSH 客户端&#xff08;openssh-client&#xff09;&#xff0c;未安装服务端&#xff08;openssh-server&#xff09;,需要手动安装并…...

美信监控易:揭秘高效数据采集和数据分析双引擎

在当今复杂多变的运维环境中&#xff0c;一款强大的运维管理软件对于保障企业的IT系统稳定运行至关重要。北京美信时代的美信监控易运维管理软件&#xff0c;凭借其卓越的数据分析双引擎&#xff0c;成为了众多运维团队的首选。 首先&#xff0c;美信监控易的数据采集引擎展现出…...

基于STM32+FPGA的地震数据采集器软件设计,支持RK3568+FPGA平台

0 引言 地震观测是地球物理观测的重点&#xff0c;是地震学和 地球物理学发展的基础 [1] 。地震数据采集器主要功 能是将地震计采集的地震波模拟信号转换为数字信 号并进行记录或传输 [2] &#xff0c;为地震学提供大量的基础 数据。本文将介绍基FPGAARM的地震数据采集器软…...

NO.95十六届蓝桥杯备战|图论基础-单源最短路|负环|BF判断负环|SPFA判断负环|邮递员送信|采购特价产品|拉近距离|最短路计数(C++)

P3385 【模板】负环 - 洛谷 如果图中存在负环&#xff0c;那么有可能不存在最短路。 BF算法判断负环 执⾏n轮松弛操作&#xff0c;如果第n轮还存在松弛操作&#xff0c;那么就有负环。 #include <bits/stdc.h> using namespace std;const int N 2e3 10, M 3e3 1…...

Linux 网络管理深度指南:从基础到高阶的网卡、端口与路由实战

一、网卡管理&#xff1a;构建网络连接的基石 1.1 现代网络工具链解析 在当代Linux系统中&#xff0c;iproute2套件已全面取代传统的net-tools&#xff0c;其优势体现在&#xff1a; 推荐组合命令&#xff1a; ip -c addr show | grep "inet " # 彩色显示有效IP…...

《重构全球贸易体系用户指南》解读

文章目录 背景核心矛盾与理论框架美元的“特里芬难题”核心矛盾目标理论框架 政策工具箱的协同运作机制关税体系的精准打击汇率政策的混合干预安全工具的复合运用 实施路径与全球秩序重构阶段性目标 风险传导与反制效应内部失衡加剧外部反制升级系统性风险 范式突破与理论再思考…...

stateflow中的函数

最近开始使用STATEFLOW,感觉功能比较强大,在嵌入式的应用中应该缺少不了,先将用到的仔细总结一下。还有一点,积极拥抱ai,学会使用AI的强大功能来学习。 在 Stateflow 中,不同类型的函数和状态适用于不同的建模需求。以下是 图形函数(Graphical Function)、Simulink 函…...

41.[前端开发-JavaScript高级]Day06-原型关系图-ES6类的使用-ES6转ES5

JavaScript ES6实现继承 1 原型继承关系图 原型继承关系 创建对象的内存表现 2 class方式定义类 认识class定义类 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&qu…...

Flutter学习四:Flutter开发基础(一)Widget

Widget 简介 0 引言 本文是对 Flutter Widget 相关知识的学习和总结。 1 Widget 概念 1.1 Widget 基础 Widget 字面意思&#xff1a;控件、组件、部件、微件、插件、小工具widget 的功能是"描述一个UI元素的配置信息"&#xff0c;所谓的配置信息就是 Widget 接收…...

Dify智能体平台源码二次开发笔记(6) - 优化知识库pdf文档的识别

目录 前言 新增PdfNewExtractor类 替换ExtractProcessor类 最终结果 前言 dify的1.1.3版本知识库pdf解析实现使用pypdfium2提取文本&#xff0c;主要存在以下问题&#xff1a; 1. 文本提取能力有限&#xff0c;对表格和图片支持不足 2. 缺乏专门的中文处理优化 3. 没有文档结…...

【LaTeX】公式图表进阶操作

公式 解决不认识的符号 查资料&#xff1a;1&#xff09;知道符号样子&#xff1b;2&#xff09;知道符号含义 放大版括号 用来括住存在分式的式子&#xff0c;或者用来括住内部由有很多括号的式子。用法是在左右括号[]分别加上\left和\right \[ J_r\dfrac{i \hbar}{2m} \l…...

第二阶段:数据结构与函数

模块4&#xff1a;常用数据结构 (Organizing Lots of Data) 在前面的模块中&#xff0c;我们学习了如何使用变量来存储单个数据&#xff0c;比如一个数字、一个名字或一个布尔值。但很多时候&#xff0c;我们需要处理一组相关的数据&#xff0c;比如班级里所有学生的名字、一本…...

matlab中simulink的快捷使用方法

连接系统模块还有如下更有效的方式:单击起始模块。 按下 Ctrl键&#xff0c;并单击目标块。 图示为已经连接好的系统模块 旋转模块&#xff1a;选中模块后按图示点击即可...

Redux部分

在src文件夹下 的store文件夹下创建modules/user.js和index.js module/ user.js // 存储用户相关const { createSlice } require("reduxjs/toolkit");const userStore createSlice({name:"user",// 数据状态initialState:{token:},// 同步修改方法red…...

基于STM32F103C8T6的温湿度检测装置

一、系统方案设计 1、系统功能分析 本项目设计的是一款基于STM32F103C8T6的温室大棚检测系统低配版。由 STM32F103C8T6最小系统板&#xff0c;OLED显示屏&#xff0c;DHT11温湿度检测传感器&#xff0c;光敏电阻传感器组成&#xff0c; 可以实现如下功能&#xff1a; 使用D…...

设计模式 - 单例模式

一个类不管创建多少次对象&#xff0c;永远只能得到该类型一个对象的实力 常用到的&#xff0c;比如日志模块&#xff0c;数据库模块 饿汉式单例模式&#xff1a;还没有获取实例对象&#xff0c;实例对象就已经产生了 懒汉式单例模式&#xff1a;唯一的实例对象&#xff0c;…...

Linux驱动开发1 - Platform设备

背景 所有驱动开发都是基于全志T507&#xff08;Android 10&#xff09;进行开发&#xff0c;用于记录驱动开发过程。 简介 什么是platform驱动自己上网搜索了解。 在driver/linux/platform_device.h中定义了platform_driver结构体。 struct platform_driver {int (*probe…...

力扣-hot100(盛最多水的容器)

11. 盛最多水的容器 中等 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xf…...

使用 PyTorch 构建 UNet 图像去噪模型:从数据加载到模型训练的完整流程

图像去噪是计算机视觉中的一个基础问题&#xff0c;在医学图像、遥感、夜间视觉等领域有广泛应用。本文将手把手带你用 PyTorch 构建一个 UNet 架构的图像去噪模型&#xff0c;包括数据预处理、网络搭建、PSNR 评估与模型保存的完整流程。 本项目已支持将数据增强版本保存为独立…...

从信号处理角度理解图像处理的滤波函数

目录 1、预备知识 1.1 什么是LTI系统? 1.1.1 首先来看什么是线性系统,前提我们要了解什么是齐次性和叠加性。...

集合框架--List集合详解

List集合 List 接口直接继承 Collection 接口&#xff0c;它定义为可以存储重复元素的集合&#xff0c;并且元素按照插入顺序有序排列&#xff0c;且可以通过索引访问指定位置的元素。常见的实现有&#xff1a;ArrayList、LinkedList。 Arraylist:有序、可重复、有索引 Linke…...

需求分析---软件架构师武器库中的天眼系统

在软件架构中&#xff0c;需求分析决定了系统的核心设计方向。 然而&#xff0c;现实中的需求往往存在以下问题&#xff1a; 需求被二次加工&#xff1a;产品经理或业务方可能直接提供“解决方案”&#xff08;如“我们需要一个聊天功能”&#xff09;&#xff0c;而非原始需…...

Spring Cloud Gateway 的执行链路详解

Spring Cloud Gateway 的执行链路详解 &#x1f3af; 核心目标 明确 Spring Cloud Gateway 的请求处理全过程&#xff08;从接收到请求 → 到转发 → 到返回响应&#xff09;&#xff0c;方便你在合适的生命周期节点插入你的逻辑。 &#x1f9f1; 核心执行链路图&#xff08;执…...

Python----机器学习(基于PyTorch框架的逻辑回归)

逻辑回归是一种广泛使用的统计学习方法&#xff0c;主要用于处理二分类问题。它基于线性回归模型&#xff0c;通过Sigmoid函数将输出映射到[0, 1]范围内&#xff0c;表示实例属于正类别的概率。尽管逻辑回归适用于二分类任务&#xff0c;但在多分类问题中常使用Softmax函数&…...

工业数据治理范式革新:时序数据库 TDengine虚拟表技术解析

小T导读&#xff1a;在工业数字化过程中&#xff0c;数据如何从设备采集顺利“爬坡”到上层应用&#xff0c;一直是个难题。传统“单列模型”虽贴合设备协议&#xff0c;却让上层分析举步维艰。TDengine 用一种更聪明的方法打通了这条数据通路&#xff1a;不强求建模、不手动转…...

Linux的应用领域,Linux的介绍,VirtualBox和Ubuntu的安装,VMware的安装和打开虚拟机CentOS

目录 Linux的应用领域 Linux的介绍 Linux的介绍 Linux发行版 Unix和Linux的渊源 虚拟机和Linux的安装 VirtualBox和Ubuntu的安装 安装VirtualBox 安装Ubuntu 下载Ubuntu操作系统的镜像文件 创建虚拟机 虚拟机设置 启动虚拟机&#xff0c;安装Ubuntu系统 Ubuntu基…...

使用 Java 8 Stream实现List重复数据判断

import java.util.*; import java.util.stream.Collectors;public class DeduplicateStreamExample {static class ArchiveItem {// 字段定义与Getter/Setter省略&#xff08;需根据实际补充&#xff09;private String mATNR;private String lIFNR;private String suppSpecMod…...

GDAL:地理数据的万能瑞士军刀

目录 1. 什么是GDAL&#xff1f;2. 为什么需要GDAL&#xff1f;3. GDAL的主要功能3.1. 数据转换3.2. 数据裁剪和处理3.3. 读取和写入多种格式 4. 实际应用场景4.1 环境监测4.2 城市规划4.3 导航系统 5. 技术原理简单解释6. 如何使用GDAL&#xff1f;6.1 简单命令示例 7. 学习建…...

每日文献(十三)——Part two

今天从第三章节&#xff1a;“实现细节”开始介绍。 目录 三、实现细节 四、实验 五、总结贡献 六、致谢 三、实现细节 我们在多尺度图像上训练和测试区域建议和目标检测网络。这是在KITTI目标检测基准[13]上基于CNN的目标检测的趋势。例如&#xff0c;在[16]中&#xff…...

ArrayList 和 LinkedList 区别

ArrayList 和 LinkedList 是 Java 集合框架中两种常用的列表实现&#xff0c;它们在底层数据结构、性能特点和适用场景上有显著的区别。以下是它们的详细对比以及 ArrayList 的扩容机制。 1. ArrayList 和 LinkedList 的底层区别 (1) 底层数据结构 ArrayList&#xff1a; 基于…...

【iOS】UITableView性能优化

UITableView性能优化 前言优化从何入手优化的本质 CPU层级优化1. Cell的复用2. 尽量少定义Cell&#xff0c;善于使用hidden控制显示视图3. 提前计算并缓存高度UITableView的代理方法执行顺序Cell高度缓存高度数组 4. 异步绘制5. 滑动时按需加载6. 使用异步加载图片&#xff0c;…...

通过检索增强生成(RAG)和重排序提升大语言模型(LLM)的准确性

探索大语言模型&#xff08;LLM&#xff09;结合有效信息检索机制的优势。实现重排序方法&#xff0c;并将其整合到您自己的LLM流程中。 想象一下&#xff0c;一个大语言模型&#xff08;LLM&#xff09;不仅能提供相关答案&#xff0c;还能根据您的具体需求进行精细筛选、优先…...

IDEA202403常用快捷键【持续更新】

文章目录 一、全局搜索二、美化格式三、替换四、Git提交五、代码移动六、调试运行 在使用IDEA进行程序开发&#xff0c;快捷键会让这个过程更加酸爽&#xff0c;下面记录各种快捷键的功能。 一、全局搜索 快捷键功能说明Shift Shift全局搜索Ctrl N搜索Java类 二、美化格式 …...

硬件元件三极管:从基础到进阶的电子探秘

一、基础理论 1. PN结&#xff08;二极管&#xff09; PN 结是采用不同的掺杂工艺&#xff0c;将 P 型半导体与 N 型半导体紧密接触而形成的一个界面区域。也就是我们常说的二极管。&#xff08;P型带正电、N型带负电&#xff0c;电流由P流向N&#xff09; 形成过程&#xff1…...

4. k8s核心概念 pod deployment service

以下是 Kubernetes 的核心概念详解&#xff0c;涵盖 Pod、Service、Deployment 和 Node&#xff0c;以及它们之间的关系和实际应用场景&#xff1a; 1. Pod 定义与作用 • 最小部署单元&#xff1a;Pod 是 Kubernetes 中可创建和管理的最小计算单元&#xff0c;包含一个或多个…...

12.第二阶段x64游戏实战-远程调试

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;11.第二阶段x64游戏实战-框架代码细节优化 本次写的内容是关于调试、排错相关的…...

自然语言处理的进化:BERT模型深度剖析

自然语言处理&#xff08;NLP&#xff09;领域近年来取得了跨越式的发展&#xff0c;尤其是随着深度学习技术的应用&#xff0c;不少新兴模型应运而生。其中&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;作为一种革命性的…...