【设计模式精讲 Day 4】建造者模式(Builder Pattern)


文章简述:

在软件开发中,对象的构造过程往往复杂且容易出错,尤其是在对象包含多个可选参数或构建步骤时。建造者模式(Builder Pattern)正是为了解决这一问题而诞生的一种创建型设计模式。本文作为“设计模式精讲”系列的第4天,系统讲解了建造者模式的核心思想、结构组成、适用场景和实现方式。文章通过真实项目案例分析,展示了如何利用建造者模式提升代码的可读性、灵活性与可维护性。同时,结合Java标准库和主流框架中的应用实例,深入解析了该模式在实际开发中的价值。文末还对比了建造者模式与其他创建型模式的区别,并给出了最佳实践建议。


一、模式定义:建造者模式的核心思想

建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

换句话说,建造者模式允许你逐步构建一个复杂的对象,而不是一次性使用大量参数调用构造函数。它通过一系列方法逐步设置对象的各个属性,最终返回完整的对象。

核心思想

  • 解耦构建逻辑与对象表示
  • 支持不同风格的对象构造
  • 避免构造函数爆炸(overloading)

二、模式结构:UML类图与关键角色说明

虽然我们无法插入图片,但以下文字描述了建造者模式的典型UML结构:

  1. Builder(抽象建造者)
    定义创建产品各个部件的抽象方法,如 buildPartA()buildPartB() 等。

  2. ConcreteBuilder(具体建造者)
    实现 Builder 接口,负责构建并装配产品部件,最终返回完整的产品对象。

  3. Product(产品)
    被构建的复杂对象,由多个部件组成。

  4. Director(指挥者)
    不直接与客户端交互,而是指导建造者按照特定顺序构建产品,通常不暴露具体的构建细节。


三、适用场景:何时使用建造者模式?

建造者模式适用于以下几种情况:

场景描述
对象构造复杂对象有多个可选参数或构建步骤
构造过程需要灵活控制需要根据配置或条件变化来构建不同版本的对象
避免构造函数爆炸防止因参数过多导致构造函数重载过多
提高可读性和可维护性使对象构造过程更清晰、模块化

例如:

  • 构建一个复杂的 Computer 对象,包含 CPU、内存、硬盘等组件。
  • 构建一个 Meal(套餐),包含主菜、饮料、甜点等部分。
  • 构建一个 Report(报告),包含标题、正文、图表等内容。

四、实现方式:完整的Java代码示例

以下是一个典型的建造者模式实现示例,用于构建一个 Computer 对象。

4.1 抽象建造者(Builder)

/*** 抽象建造者:定义构建计算机的各个步骤*/
public interface ComputerBuilder {void buildCPU();void buildMemory();void buildStorage();void buildGraphicsCard();Computer getComputer();
}

4.2 具体建造者(ConcreteBuilder)

/*** 具体建造者:构建高性能计算机*/
public class HighPerformanceComputerBuilder implements ComputerBuilder {private Computer computer;public HighPerformanceComputerBuilder() {this.computer = new Computer();}@Overridepublic void buildCPU() {computer.setCPU("Intel i9");}@Overridepublic void buildMemory() {computer.setMemory("64GB DDR4");}@Overridepublic void buildStorage() {computer.setStorage("2TB NVMe SSD");}@Overridepublic void buildGraphicsCard() {computer.setGraphicsCard("NVIDIA RTX 4090");}@Overridepublic Computer getComputer() {return computer;}
}

4.3 产品类(Product)

/*** 产品:表示计算机对象*/
public class Computer {private String cpu;private String memory;private String storage;private String graphicsCard;// Getter 和 Setter 方法public String getCpu() { return cpu; }public void setCpu(String cpu) { this.cpu = cpu; }public String getMemory() { return memory; }public void setMemory(String memory) { this.memory = memory; }public String getStorage() { return storage; }public void setStorage(String storage) { this.storage = storage; }public String getGraphicsCard() { return graphicsCard; }public void setGraphicsCard(String graphicsCard) { this.graphicsCard = graphicsCard; }@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", storage='" + storage + '\'' +", graphicsCard='" + graphicsCard + '\'' +'}';}
}

4.4 指挥者(Director)

/*** 指挥者:指导建造者按顺序构建计算机*/
public class ComputerDirector {private ComputerBuilder builder;public ComputerDirector(ComputerBuilder builder) {this.builder = builder;}public Computer constructComputer() {builder.buildCPU();builder.buildMemory();builder.buildStorage();builder.buildGraphicsCard();return builder.getComputer();}
}

4.5 使用示例

public class Client {public static void main(String[] args) {ComputerBuilder builder = new HighPerformanceComputerBuilder();ComputerDirector director = new ComputerDirector(builder);Computer computer = director.constructComputer();System.out.println(computer);}
}

输出结果

Computer{cpu='Intel i9', memory='64GB DDR4', storage='2TB NVMe SSD', graphicsCard='NVIDIA RTX 4090'}

五、工作原理:建造者模式如何解决问题?

建造者模式通过将对象的构建过程分解为多个独立的步骤,实现了以下目标:

  • 解耦构建逻辑与对象表示:客户端无需知道内部构造细节,只需提供建造者接口即可。
  • 支持灵活的构建流程:可以通过不同的建造者实现不同的产品变体。
  • 避免构造函数爆炸:减少构造函数的参数数量,提高可读性和可维护性。

例如,在构建 Computer 对象时,如果采用传统构造函数的方式,可能会出现如下问题:

Computer c = new Computer("Intel i9", "64GB DDR4", "2TB NVMe SSD", "NVIDIA RTX 4090");

随着参数增加,构造函数会变得难以管理。而使用建造者模式后,构建过程更加清晰、可控。


六、优缺点分析:建造者模式的利与弊

优点缺点
解耦构建逻辑与对象表示增加了系统的复杂度
支持不同风格的对象构造如果产品结构变化频繁,建造者可能需要频繁修改
避免构造函数爆炸适合对象构造步骤固定且复杂的情况
提高可读性和可维护性不适合简单对象的构造

七、案例分析:电商平台商品详情页构建

7.1 问题背景

某电商平台的商品详情页需要展示多种类型的商品信息,包括普通商品、促销商品、预售商品等。每种商品的信息结构略有差异,但整体构建逻辑相似。

7.2 问题分析

  • 商品信息包含多个字段,如名称、价格、库存、图片、描述等。
  • 不同类型的商品需要不同的构建逻辑(如促销商品需要额外添加折扣信息)。
  • 直接使用构造函数或工厂方法会导致代码重复和难以维护。

7.3 解决方案

引入建造者模式,定义通用的 ProductBuilder 接口,然后为每种商品类型实现具体的建造者。

示例代码(简化版):
interface ProductBuilder {void buildName();void buildPrice();void buildStock();void buildDescription();Product build();
}class NormalProductBuilder implements ProductBuilder {private Product product = new Product();@Overridepublic void buildName() { product.setName("普通商品"); }@Overridepublic void buildPrice() { product.setPrice(100); }@Overridepublic void buildStock() { product.setStock(100); }@Overridepublic void buildDescription() { product.setDescription("这是一个普通商品"); }@Overridepublic Product build() { return product; }
}class PromotionProductBuilder implements ProductBuilder {private Product product = new Product();@Overridepublic void buildName() { product.setName("促销商品"); }@Overridepublic void buildPrice() { product.setPrice(80); }@Overridepublic void buildStock() { product.setStock(50); }@Overridepublic void buildDescription() { product.setDescription("这是一个促销商品,享受8折优惠"); }@Overridepublic Product build() { return product; }
}

7.4 效果对比

方案可维护性扩展性可读性
直接构造
工厂方法一般一般一般
建造者模式优秀优秀优秀

八、与其他模式的关系:建造者模式 vs 工厂模式 vs 抽象工厂模式

模式核心目的适用场景与建造者模式的对比
工厂模式创建单一对象当对象种类较少,且不需要复杂构建流程工厂模式侧重于“创建”,建造者模式侧重于“构建”
抽象工厂模式创建一组相关对象当需要创建多个相关对象时抽象工厂关注对象族,建造者关注对象构建步骤
建造者模式构建复杂对象当对象构建过程复杂,需分步完成更强调构建过程的灵活性和可扩展性

九、总结与预告

本篇文章详细介绍了建造者模式的核心思想、结构组成、适用场景以及实现方式,并通过真实项目案例展示了其在实际开发中的应用价值。建造者模式通过解耦构建逻辑与对象表示,提升了代码的可读性、可维护性和灵活性。

核心技能总结:

  • 掌握建造者模式的定义、结构和应用场景。
  • 能够识别哪些场景适合使用建造者模式。
  • 能够使用 Java 实现建造者模式,构建复杂对象。
  • 理解建造者模式与其他创建型模式的区别与联系。

下一篇预告:

Day 5: 原型模式(Prototype Pattern)

我们将深入探讨原型模式的设计思想,学习如何通过复制现有对象来创建新对象,从而提高性能并简化对象创建过程。欢迎继续关注本系列文章!


文章标签:

design-patterns, java, builder-pattern, software-design, object-oriented-programming


进一步学习参考资料:

  1. 《设计模式:可复用面向对象软件的基础》 - GoF
  2. Java Design Patterns - Oracle 官方文档
  3. 《Effective Java》 - Joshua Bloch
  4. Builder Pattern in Java - GeeksforGeeks
  5. Java Design Patterns: Builder - Baeldung

如需获取完整代码示例与测试脚本,请关注本系列文章后续更新。欢迎在CSDN评论区交流您的使用经验与优化思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910272.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910272.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910272.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何轻松地将联系人从 iPhone 转移到 iPhone?

也许您升级到最新的 iPhone 型号,或者需要切换到另一部 iPhone 来工作。无论如何,您不能错过您的联系人,这对每个人来说都是最重要的数据。因此,今天我们将分享 5 种如何将联系人从 iPhone 转移到 iPhone 的方法,帮助您…

【51单片机简单的流水灯程序问题】2022-5-24

1.利用单片机的P2口接8个发光二极管。简单的流水灯程序问题-编程语言-CSDN问答 2.发光二极管自由闪烁(自己设计两种模式)。 3.可通过按键实现暂停、启动以及不用模式的切换。 4. 利用Proteus绘制电路原理图 5. 元件选型&#xff1…

第七节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 用户管理(上)

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 对接后端登录接口(上) ✅ 第四节:Vben Ad…

1572. 矩阵对角线元素的和

给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat [[1,2,3],[4,5,6],[7,8,9]] 输出:25 解释:对角线的和为&#xf…

供应链场景使用ClickHouse最佳实践

一、概述 ClickHouse是一款由俄罗斯公司Yandex开发的开源列式数据库管理系统,以其高性能的分析查询能力和高压缩比著称。供应链场景中,数据量大且数据类型复杂,需要高效的数据存储和快速的查询性能,ClickHouse在这些方面具有显著…

RA4M2开发IOT(0)----安装e² studio

RA4M2开发IOT.0--安装e studio 概述视频教学样品申请安装 概述 瑞萨电子灵活配置软件包 (FSP) 是用于嵌入式系统设计的高质量增强型软件包,支持瑞萨电子 RA 产品家族 Arm 微控制器,提供用户友好的界面且可灵活扩展,确保从入门级到高性能的整…

【Ambari3.0.0 部署】Step2—免密登陆认证-适用于el8

如果有其他系统部署需求可以参考原文 戳我->所有组件编译教程 戳我->获取部署源代码 一、免密登录认证 🔐 在多台服务器协同工作的环境中,免密登录(SSH 免密认证)是一种常见的优化手段,能够极大地提升运维效率&…

网站自助广告投放系统源码 附安装教程(源码下载)

网站自助广告投放系统源码 全自动无人化出售网站广告位 站长必备 源码测试可用,部分加密。感兴趣自行下载 源码下载:https://download.csdn.net/download/m0_66047725/91093092 更多资源下载:关注我 图片:

日常运维问题汇总-15

42.SD开票计划产生的预收款在正式开票时未自动清账 统驭科目(应收、预收)对应的字段状态组中附加科目设置销售订单字段设置为了隐藏导致,更改为“可选输入项” 43.MIGO取消凭证时,用户反馈发现除一行外,其它都不能取消…

【设计模式】6.原型模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 原型模式 1. 基础 import copyclass Resume:def __init__(self, name):self.name nameself.sex Noneself.age Noneself.time_area Noneself.compan…

【算法 day08】LeetCode 151.翻转字符串里的单词 |卡码网:55.右旋转字符串

151.翻转字符串里的单词 题目链接 | 文档讲解 |视频讲解 : 链接 1.思路: 1.去除字符串头尾的空格 ,使用库函数 trim() 2.对字符串进行分割,使用库函数split() 3.创建StringBuilder sb&#x…

【WordPress优化插件】WPOPT v2.4.7

WPOPT插件,是由本站开发的一款WordPress优化插件,能对WordPress底层功能进行优化,支持功能开关,系统加速等功能。 2.0版本全新发布,采用vite打包,界面采用Vue3+element-plus制作。无论是外观,还是框架功能,都是空前的强大。 功能更多,更强,是所有WordPress网站都值得…

如何使用 mkimage 工具生成 uImage 文件(RISC-V 环境)

一、mkimage 命令参数详解 在 RISC-V Linux 环境下,使用 U-Boot 的 mkimage 工具生成 uImage 的基本命令格式如下: mkimage -A riscv -O linux -T kernel -C compression -a load_addr -e entry_addr -n "描述信息" -d Image uImage核心参数…

React Native 搭建iOS与Android开发环境

目录 第一步 第二步 一、必须安装的工具 二、具体安装步骤 1. 安装 Homebrew 切换国内源和其他配置: 2. 安装 node 3.下载watchman 4. Ruby 5.CocoaPods 配置环境 6. jdk 7. 配置git 开发环境 第三步——启动项目(可以忽略) 1…

Vue 简写形式全解析:清晰记忆指南

Vue 简写形式全解析:清晰记忆指南 Vue 中的各种简写形式确实容易混淆,我将它们系统化整理,并提供了多种记忆方法,帮助你轻松掌握! 一、核心简写形式汇总表 完整形式简写形式适用场景记忆技巧v-bind:attribute:attribute动态绑定属性: 像链条,表示"绑定"v-on:…

车载电子电器架构 --- 电子电气架构设计方案

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

MVCC中read_view的核心参数解析与读操作流程实战

在数据库并发控制领域,MVCC(多版本并发控制)是实现高性能读写并发的关键技术。其中,read_view作为MVCC判断数据可见性的核心组件,其内部参数的设计直接影响着并发访问的行为。本文将深入解析read_view的三个核心参数&a…

从代码学习深度强化学习 - REINFORCE 算法 PyTorch版

文章目录 前言**一、 理论基础:什么是策略梯度?****1.1 基于价值 vs. 基于策略****1.2 策略梯度(Policy Gradient)****1.3 REINFORCE 算法:蒙特卡洛策略梯度****1.4 REINFORCE 算法流程****二、 PyTorch 代码实践****2.1 环境与辅助函数****2.2 核心算法实现****2.3 训练与…

CRMEB 代码规范指南:ThinkPHP6+Uni-app 架构下的开发标准

二、代码规范 2.1 Vue .1.1 代码结构 <template><div id"my-component"><DemoComponent /></div> </template><script> import DemoComponent from ../components/DemoComponentexport default {name: MyComponent,component…

游戏技能编辑器开发完全指南系统架构设计之技能编辑器整体架构

技能编辑器整体架构 角色资源划分与管理 1. 角色资源结构 角色资源划分与管理 1. 角色资源结构 // 骨骼重定向示例 void RetargetAnimation(Animation& srcAnim, Skeleton& targetSkeleton) {for (int frame 0; frame < srcAnim.numFrames; frame) {for (Bone&a…