设计模式--建造者模式(Builder Pattern)
一、什么是建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它关注如何按照一定的步骤和规则创建复杂对象。建造者模式的主要目的是将一个复杂对象的构建过程与其表示分离,从而使同样的构建过程可以创建不同的表示。
在建造者模式中,通常有以下几个核心角色:
- 产品(Product):表示要创建的复杂对象。产品类通常包含多个组成部分。
- 抽象建造者(Abstract Builder):定义了创建产品各个部分的接口,通常包含一系列抽象方法来构建不同的部分。
- 具体建造者(Concrete Builder):实现了抽象建造者接口,负责实际构建产品的各个部分。每个具体建造者可以定义不同的构建步骤和规则,从而创建不同的产品。
- 指挥者(Director):负责指导具体建造者构建产品的过程,通常通过一系列步骤来控制构建的顺序和流程。
使用建造者模式可以在构建复杂对象时,将构建逻辑分离出来,使得构建过程更加灵活,易于扩展和维护。这种模式特别适用于需要构建多种不同表示的对象,以及对象的构建过程比较复杂的情况。
与其他创建型模式(如工厂模式)相比,建造者模式更加关注对象的构建过程,而不仅仅是对象的实例化。它允许逐步构建对象的各个部分,从而更好地控制对象的创建和组装。
二、建造者模式的代码样例
以下是一个使用C++实现建造者模式的简单示例:
#include <iostream>
#include <string>// 产品类
class Product {
public:void setPartA(const std::string& part) {partA = part;}void setPartB(const std::string& part) {partB = part;}void setPartC(const std::string& part) {partC = part;}void show() {std::cout << "Product Parts: " << partA << ", " << partB << ", " << partC << std::endl;}private:std::string partA;std::string partB;std::string partC;
};// 抽象建造者类
class Builder {
public:virtual void buildPartA() = 0;virtual void buildPartB() = 0;virtual void buildPartC() = 0;virtual Product* getResult() = 0;
};// 具体建造者类A
class ConcreteBuilderA : public Builder {
public:void buildPartA() override {product->setPartA("Part A from ConcreteBuilderA");}void buildPartB() override {product->setPartB("Part B from ConcreteBuilderA");}void buildPartC() override {product->setPartC("Part C from ConcreteBuilderA");}Product* getResult() override {return product;}private:Product* product = new Product();
};// 指挥者类
class Director {
public:void construct(Builder* builder) {builder->buildPartA();builder->buildPartB();builder->buildPartC();}
};int main() {Director director;ConcreteBuilderA builderA;director.construct(&builderA);Product* productA = builderA.getResult();productA->show();return 0;
}
在这个示例中,我们定义了一个产品类 Product,一个抽象建造者类 Builder,以及一个具体建造者类 ConcreteBuilderA。还有一个指挥者类 Director,负责调用具体建造者来构建产品。在主函数中,我们创建了一个具体建造者对象 builderA,然后通过指挥者的指导来构建产品,并最终显示产品的部件。
建造者模式允许通过不同的具体建造者来构建不同的产品,以及通过不同的构建步骤来创建不同的产品表示。这种模式将构建过程与产品本身分离,使得创建复杂对象更加灵活和可维护。
三、使用建造者模式的注意事项
使用建造者模式时需要注意以下几个问题:
- 复杂性:建造者模式适用于创建复杂的对象,但也会引入更多的类和结构,增加了代码的复杂性。因此,只在对象的构建过程比较复杂且存在多个步骤时使用建造者模式。
- 指挥者的作用:指挥者类负责控制具体建造者的调用顺序和构建步骤,但指挥者本身可能会变得复杂。需要确保指挥者不过于复杂,以免影响代码的可维护性。
- 关注点分离:建造者模式将对象的构建过程与产品的表示分离,这样可以使构建过程更加灵活。但也可能导致代码中出现多个类,需要确保关注点清晰分离,以便维护和理解代码。
- 构建过程不可逆:建造者模式一般是逐步构建对象的各个部分,因此构建过程是不可逆的。一旦开始构建,就不能随意地取消或逆向操作。这可能会受到一些业务需求的限制。
- 变种和扩展:如果需要支持多种不同类型的产品,可能需要创建多个具体的建造者类。这可能导致代码的扩展,需要仔细权衡何时引入新的建造者。
- 性能:建造者模式可能会在对象构建过程中引入一些额外的开销,特别是在对象的部件较多或构建过程复杂的情况下。在性能要求较高的场景下,需要考虑这种开销是否可接受。
总之,建造者模式可以在创建复杂对象时提供更灵活的构建过程,并帮助分离对象的创建和表示。但也需要根据具体的场景权衡其优缺点,避免过度复杂化和不必要的设计。

相关文章:
设计模式--建造者模式(Builder Pattern)
一、什么是建造者模式 建造者模式(Builder Pattern)是一种创建型设计模式,它关注如何按照一定的步骤和规则创建复杂对象。建造者模式的主要目的是将一个复杂对象的构建过程与其表示分离,从而使同样的构建过程可以创建不同的表示。…...
若依vue打印的简单方法
像我们后端程序员做前端的话,有时候真不需要知道什么原理,直接塞就好了 我们选用基于hiprint 的vue-plugin-hiprint来打印 目的是为了实现点击某些行的数据,然后点击某个按钮直接弹出下面的打印 此链接 大佬是原创,我拿来总结梳理一下 插件进阶功能请移步: 链接 插件模板制作页…...
Rust 基础语法学习
Rust 基础语法学习 文章目录 Rust 基础语法学习hello world变量数据类型整数类型进制表示方法浮点数类型布尔类型字符类型字符串复合类型元组结构体元组结构体 切片类型字符串切片数组切片 不可变变量与可变变量常量注释函数语句与表达式 流程控制语句if else条件判断while循环…...
iOS开发Swift-函数
1.函数的定义和调用 func greet(person: String) -> String { // 函数名 传入值 传入值类型 返回值类型let greeting "Hello" personreturn greeting } print( greet(person: "Anna") ) //调用2.函数的参数与返回值 (1)无参函数 func sayHe…...
序列化协议:JSON和XML
作者:CARROT 链接:https://www.zhihu.com/question/604811576/answer/3100483698 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 json和xml都是数据传输的格式。比如我们开发过程中需要和网…...
江西萍乡能源石油化工阀门三维扫描3d测量抄数建模-CASAIM中科广电
长期以来,石油天然气、石油石化、发电和管道输送行业在环保、健康和安全保障方面一直承受着巨大的压力,他们必须确保相关规程在各项作业中得到全面贯彻。 阀门作为流体管道运输中的组成部分,其装配密封度是保证流体运输安全的重要一环&#…...
Go【gin和gorm框架】实现紧急事件登记的接口
简单来说,就是接受前端微信小程序发来的数据保存到数据库,这是我写的第二个接口,相比前一个要稍微简单一些,而且因为前端页面也是我写的,参数类型自然是无缝对接_ 前端页面大概长这个样子 先用apifox模拟发送请求测试…...
第一个VUE程序?
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head> <body><div id"app">{{message}} </div><!-- 1.导入Vue.js --> <script s…...
电阻器件的分类
电阻器的种类碳膜电阻膜式电阻器中的一种。气态碳氢化合物在高温和真空中分解,碳沉积在瓷棒或者瓷管上,形成一层结晶碳膜。改变碳膜厚度和用刻槽的方式变更碳膜的长度可以得到不同的阻值。碳膜电阻成本较低,电性能和稳定性较差,一…...
QT基础教程之二 第一个Qt小程序
QT基础教程之二 第一个Qt小程序 按钮的创建 在Qt程序中,最常用的控件之一就是按钮了,首先我们来看下如何创建一个按钮 QPushButton * btn new QPushButton; 头文件 #include <QPushButton>//设置父亲btn->setParent(this);//设置文字btn-&g…...
Edge用户数据目录查找
创建 Microsoft Edge 用户数据目录变量...
最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码|霸王餐美团/饿了么系统/外卖红包cps粉丝裂变玩法源码下载
最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码、霸王餐美团、饿了么系统,粉丝裂变玩源码下载,外卖cps小程序项目,外卖红包cps带好友返利佣金分销系统程序、饿了么美团联盟源码,外卖cps带分销返利后端源码,基于L…...
数据库事务四大特性
事务的4大特性(ACID): 原子性(Atomicity): 事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。 一致性(Consistemcy): 事务前后,数据库的状态都满足所有的完…...
浅谈Router和Route
router 和 route 是在前端框架中用于管理和处理路由的两个关键概念。这两者之间的关系可以通过具体的代码来解释。在本示例中,我将使用 React 和 React Router 来说明它们之间的关系。 Router(路由器):Router 是一个库或框架&…...
Linux环境安装jdk
1.安装jdk 上传jdk.tar.gz;安装包在下载内容里可以直接下载tar -zxvf jdk.tar.gz;配置环境变量:vi /etc/profile;填入以下内容;退出编辑模式,保存;然后source /etc/profile使配置生效; export JAVA_HOME/d…...
数据隐私与安全在大数据时代的挑战与应对
文章目录 数据隐私的挑战数据安全的挑战应对策略和方法1. 合规和监管2. 加密技术3. 匿名化和脱敏4. 安全意识培训5. 隐私保护技术 结论 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏&…...
vue3 基础知识 (生命周期) 06
你好! 文章目录 一、生命周期二、生命周期过程三、组件的 v-model 一、生命周期 每个组件都可能从 创建、挂载、更新、卸载 等一系列的过程 在这个过程中的某一个阶段,用于可能会想要 添加一些属于自己的代码逻辑(比如组件创建完成后请求一些…...
【Eclipse】汉化简体中文教程(官方汉化包,IDE自带软件安装功能),图文详情
目录 0.环境 1.步骤 1)查看eclipse的版本 2)在官网找语言包,并复制链接 3)将链接复制到eclipse中 4)汉化完成 0.环境 windows11,64位; eclipse 2021-6版本 1.步骤 思路:在官网找…...
Kotlin协程flow的debounce参数timeoutMillis特性
Kotlin协程flow的debounce参数timeoutMillis特性 <dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>1.7.3</version><type>pom</type></dependency&…...
oracle 12c怎样修改varchar2允许的最大长度
12C单实例测试,varchar2在早期版本中最大长度限制为4000,当字段长度指定的比较长的时候会报错:ORA-00910: specified length too long for its datatype。 早期版本中虽然SQL数据类型限制为4000(如表中的列的varchar2类型&#x…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果