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

23种设计模式【创建型模式】详细介绍之【建造者模式】

建造者模式:构建复杂对象的精妙设计

  • 设计模式的分类和应用场景总结
  • 建造者模式:构建复杂对象的精妙设计
    • 建造者模式的核心思想
    • 建造者模式的参与者
    • Java示例:建造者模式

设计模式的分类和应用场景总结

可以查看专栏设计模式:设计模式

建造者模式:构建复杂对象的精妙设计

建造者模式是一种创建型设计模式,用于构建复杂对象。它将对象的构建过程与其表示分离,允许您以可控和可扩展的方式构建对象。在本文中,我们将深入探讨建造者模式,解释其核心概念,并提供Java示例代码来演示如何使用建造者模式。

建造者模式的核心思想

建造者模式的核心思想是将一个复杂对象的构建过程分为多个步骤,每个步骤由一个独立的"建造者"对象负责完成。最终,这些建造者协同工作,按顺序构建出一个完整的对象。

通过使用建造者模式,您可以在构建对象时灵活地添加、修改或删除步骤,而不会影响其他部分的代码。这种分离的方式有助于管理复杂对象的构建,提高可维护性和可读性。

建造者模式的参与者

建造者模式包含以下主要参与者:

  1. 产品(Product):要构建的复杂对象。产品通常包含多个属性和方法。

  2. 抽象建造者(Builder):定义了构建产品各个部分的接口。每个部分都有一个对应的建造方法。

  3. 具体建造者(Concrete Builder):实现了抽象建造者接口,负责构建产品的各个部分。每个具体建造者都可以构建出不同类型的产品。

  4. 指挥者(Director):负责调用具体建造者的方法,按照一定的顺序构建产品。指挥者知道如何构建一个完整的产品。

Java示例:建造者模式

让我们通过一个简单的Java示例来演示建造者模式。我们将构建一个Meal对象,包括主食、饮料和甜点。

// 产品类
class Meal {private String mainCourse;private String beverage;private String dessert;public void setMainCourse(String mainCourse) {this.mainCourse = mainCourse;}public void setBeverage(String beverage) {this.beverage = beverage;}public void setDessert(String dessert) {this.dessert = dessert;}public void describe() {System.out.println("Main Course: " + mainCourse);System.out.println("Beverage: " + beverage);System.out.println("Dessert: " + dessert);}
}// 抽象建造者接口
interface MealBuilder {void buildMainCourse();void buildBeverage();void buildDessert();Meal getMeal();
}// 具体建造者实现
class VegMealBuilder implements MealBuilder {private Meal meal = new Meal();@Overridepublic void buildMainCourse() {meal.setMainCourse("Vegetarian Burger");}@Overridepublic void buildBeverage() {meal.setBeverage("Water");}@Overridepublic void buildDessert() {meal.setDessert("Fruit Salad");}@Overridepublic Meal getMeal() {return meal;}
}class NonVegMealBuilder implements MealBuilder {private Meal meal = new Meal();@Overridepublic void buildMainCourse() {meal.setMainCourse("Chicken Burger");}@Overridepublic void buildBeverage() {meal.setBeverage("Coke");}@Overridepublic void buildDessert() {meal.setDessert("Chocolate Cake");}@Overridepublic Meal getMeal() {return meal;}
}// 指挥者
class Waiter {private MealBuilder mealBuilder;public Waiter(MealBuilder mealBuilder) {this.mealBuilder = mealBuilder;}public Meal constructMeal() {mealBuilder.buildMainCourse();mealBuilder.buildBeverage();mealBuilder.buildDessert();return mealBuilder.getMeal();}
}public class BuilderPatternExample {public static void main(String[] args) {MealBuilder vegMealBuilder = new VegMealBuilder();MealBuilder nonVegMealBuilder = new NonVegMealBuilder();Waiter waiter1 = new Waiter(vegMealBuilder);Meal vegMeal = waiter1.constructMeal();System.out.println("Veg Meal:");vegMeal.describe();Waiter waiter2 = new Waiter(nonVegMealBuilder);Meal nonVegMeal = waiter2.constructMeal();System.out.println("Non-Veg Meal:");nonVegMeal.describe();}
}

在这个示例中,我们创建了一个Meal类作为产品。然后,我们定义了抽象建造者接口MealBuilder,并创建了两个具体建造者VegMealBuilderNonVegMealBuilder,它们分别构建了不同类型的餐点。最后,我们有一个Waiter类作为指挥者,它知道如何构建不同类型的餐点。

通过建造者模式,我们能够以可控和可扩展的方式构建不同类型的餐点,而不会使构建过程变得混乱。这提供了更好的灵活性和可维护性,尤其在构建复杂对象时非常有用。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]

在这里插入图片描述
加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   ↓   ↓   ↓  

相关文章:

23种设计模式【创建型模式】详细介绍之【建造者模式】

建造者模式:构建复杂对象的精妙设计 设计模式的分类和应用场景总结建造者模式:构建复杂对象的精妙设计建造者模式的核心思想建造者模式的参与者Java示例:建造者模式 设计模式的分类和应用场景总结 可以查看专栏设计模式:设计模式 …...

[量化投资-学习笔记002]Python+TDengine从零开始搭建量化分析平台-MA均线的多种实现方式

MA 均线时最基本的技术指标,也是最简单,最不常用的(通常使用EMA、SMA)。 以下用两种不同的计算方法和两种不同的画图方法进行展示和说明。 MA 均线指标公式 MA (N)(C1 C2 C3 …C N )/N目录 方式一1.SQL 直接查询均值2.使用 pyp…...

c语言 判断两个文件是否相同

使用strcmp比较&#xff1a; #include <stdio.h> #include <string.h>int Compare(const char * file1, const char* file2) {FILE* f1, * f2;int size1, size2;unsigned char buffer1[1024], buffer2[1024];f1 fopen(file1, "rb");f2 fopen(file2, &…...

【2021集创赛】Arm杯三等奖:基于FPGA的人脸检测SoC设计

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;合肥工业大学 队伍名称&#xff1a;芯创之家 指导老师&#xff1a;邓红辉、尹勇生 参赛杯赛&#xff1a;Arm杯 参赛人员&#xff1a;王亮 李嘉燊 金京 获奖情…...

Java电商平台 - API 接口设计之 token、timestamp、sign 具体架构与实现|电商API接口接入

一&#xff1a;token 简介 Token&#xff1a;访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证&#xff0c;减少用户名和密码的传输次数。一般情况下客户端(接口调用方)需要先向服务器端申请一个接口调用的账号&#xff0c;服务器会给出一个appId和一个key, …...

【带头学C++】----- 1.基础知识 ---- 1.23 运算符概述

1.23 运算符概述 运算符&#xff0c;在数学中常见的加减乘除之类的符号&#xff0c;那么在C在编程语言中呢&#xff0c;将使用特定的符号或标记对操作数进行操作以生成结果。用算术运算符将运算对象(也称操作数)连接起来的、符合C 语法规则的式子&#xff0c;称为C 算术表达式运…...

python爬虫分析基于python图书馆书目推荐数据分析与可视化

收藏关注不迷路 文章目录 前言一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、文章目录 前言 随着电子技术的普及和快速发展&#xff0c;线上管理系统被广泛的使用&#xff0c;有很多商业机构都在实现电子信息化管理&#xff0c;图书推荐也不例外&#xff0c…...

Java零基础入门-关系运算符

前言 Java作为一门广受欢迎的开发语言&#xff0c;其在企业级应用和移动应用开发中有着广泛的应用。如果你是一个Java零基础的初学者&#xff0c;那么你来到了一个正确的地方。在本篇文章中&#xff0c;我们会详细介绍Java中的关系运算符&#xff0c;帮助你快速入门。 摘要 …...

1200*A. Trust Nobody(贪心)

Problem - 1826A - Codeforces 解析&#xff1a; 从大到小枚举说谎人的个数x&#xff0c;然后查看是否有 x个人说谎即可。 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int t,n,a[N]; signed main(){scanf("%lld",&a…...

二维码智慧门牌管理系统升级解决方案:采集项目的建立与运用

文章目录 前言一、采集项目的建立二、采集项目的运用三、采集项目的意义 前言 在二维码智慧门牌管理系统的升级过程中&#xff0c;一个至关重要的环节是采集项目的建立与运用。采集项目是新建采集任务的前提&#xff0c;同时也是整个系统升级的关键步骤。其意义近似于现实中的…...

Azure - 机器学习:创建机器学习所需资源,配置工作区

目录 一、Azure机器学习工作区与计算实例简要介绍工作区计算实例 二、创建工作区1. 登录到 Azure 机器学习工作室2. 选择“创建工作区”3. 提供以下信息来配置新工作区&#xff1a;4. 选择“创建”以创建工作区 三、创建计算实例四、工作室实战4.1 工作室快速导览4.2 从示例笔记…...

电脑监控软件哪些比较好用

电脑监控软件在当今信息化时代越来越受到人们的关注&#xff0c;它们可以用于保护公司的商业机密&#xff0c;防止员工在工作中做一些不恰当的事情&#xff0c;以及在家庭中监控孩子的上网行为等。 本文将介绍一些比较好用的电脑监控软件&#xff1a; 一、域之盾软件 这款软件…...

数据结构与算法之排序: 选择排序 (Javascript版)

排序 排序&#xff1a;把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例) 选择排序 该排序属于 贪心 策略关注的是局部&#xff0c;是一种苟且的东西 算法实现 // 随机数组&#xff0c;选择排序 Array.prototype.selectionSort function() {let len this.leng…...

【前端】NodeJS核心知识点整理

1.Node.js入门案例 1.1.什么是Node.js JS是脚本语言&#xff0c;脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS&#xff0c;浏览器充当了解析器的角色。而对于需要独立运行的JS&#xff0c;NodeJS就是一个解析器。 每一种解析器都是一个运行环境&#xff0c;不但…...

计算机操作系统重点概念整理-第三章 进程同步【期末复习|考研复习】

第三章 进程同步 【期末复习|考研复习】 计算机操作系统系列文章传送门&#xff1a; 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第三章 进程同步 【期末复习|考研复习】前言三、进程同步3.1 临…...

day06-Flex布局

Flex布局 目标&#xff1a;熟练使用 Flex 完成结构化布局 01-标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 02-浮动 基本使用 作用&#xff1a;让块元素水平排…...

架构整洁之道摘录

软件架构 软件架构规则和其他变量完全⽆关。 软件设计的终极⽬标是⽤最⼩的成本来满⾜构建和维护系统的需求。 程序设计重要的是软件架构的灵活性⽽不是先实现功能。 软件系统的第⼀价值体系是系统⾏为&#xff0c;第⼆价值体系是系统架构 编程范式 结构化编程 利⽤if/else…...

流程引擎-自定义函数的应用

背景&#xff1a; 某些业务需求比较特殊&#xff0c;需要在表单中校验或实现一些功能&#xff0c;泛微流程表单配置时实现的方式多种多样&#xff1a;JS脚本、SQL语句、公式以及其他一些标准化拖拽功能&#xff0c;本次给大家分享一下流程表单中的公式实现的一些需求场景。泛微…...

ChatGLM系列二:ChatGLM2的介绍及代码实践

一、介绍 2023年06月25日&#xff0c;清华大学开源了 ChatGLM2-6B 模型&#xff0c;是 ChatGLM 模型的升级版本。ChatGLM2-6B 在多个方面有显著提升&#xff1a;模型性能更强&#xff0c;在各种测试集上的表现更好&#xff1b;支持更长的上下文&#xff0c;最大上下文长度提升…...

JDBC对数据库进行操作

一.使用JDBC查询数据库表t_user的所有数据 1.User表 名称 数据类型 主键 是否为空 说明 ID number 是 用户编号 NAME Varchar2(50) 用户名 AGE varchar2(5) 用户年龄 BIRTH date 用户生日 PWD varchar2(20) 否 用户密码 import java.sql.Connection; import java.sql.Date; …...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...