设计模式——建造者模式模式(AI回答)
请详细解释建造者模式Builder的思路、优缺点和代码示例建造者模式Builder核心思路建造者模式解决的是复杂对象的构造问题当一个对象有很多参数其中一些必填、一些选填、一些之间还有约束关系时直接用构造器或一堆 setter 会让调用方很痛苦。来看问题是怎么出现的。没有建造者时的两种困境困境一伸缩构造器Telescoping Constructor为了应对不同的参数组合写一堆重载构造器public class Pizza { public Pizza(String size) { ... } public Pizza(String size, boolean cheese) { ... } public Pizza(String size, boolean cheese, boolean pepperoni) { ... } public Pizza(String size, boolean cheese, boolean pepperoni, boolean mushroom) { ... } // 继续加参数继续加重载... } // 调用方完全看不懂这串 true/false 是什么意思 Pizza p new Pizza(large, true, false, true);困境二JavaBean 风格大量 setterPizza p new Pizza(); p.setSize(large); p.setCheese(true); p.setPepperoni(false); // 问题对象在一堆 setter 调用完之前处于半构造状态 // 无法在构造完成时做参数校验也无法做成不可变对象两种方式都有缺陷前者可读性差后者对象状态不安全。建造者模式同时解决这两个问题。Java 代码示例以构建一个 HTTP 请求对象为例参数多且可选是建造者的典型场景。产品类不可变对象public class HttpRequest { // 必填 private final String method; private final String url; // 选填 private final MapString, String headers; private final String body; private final int timeoutMs; private final boolean followRedirects; // 构造器私有只能通过 Builder 创建 private HttpRequest(Builder builder) { this.method builder.method; this.url builder.url; this.headers Collections.unmodifiableMap(builder.headers); this.body builder.body; this.timeoutMs builder.timeoutMs; this.followRedirects builder.followRedirects; } Override public String toString() { return String.format( HttpRequest{\n method%s\n url%s\n headers%s\n body%s\n timeout%dms\n followRedirects%b\n}, method, url, headers, body, timeoutMs, followRedirects); } // ── Builder 作为静态内部类 ────────────────────────────── public static class Builder { // 必填字段 private final String method; private final String url; // 选填字段带默认值 private MapString, String headers new HashMap(); private String body null; private int timeoutMs 3000; private boolean followRedirects true; // 必填参数通过构造器传入保证不可缺少 public Builder(String method, String url) { if (method null || url null) throw new IllegalArgumentException(method 和 url 不能为空); this.method method; this.url url; } // 每个 setter 返回 this支持链式调用 public Builder header(String key, String value) { this.headers.put(key, value); return this; } public Builder body(String body) { this.body body; return this; } public Builder timeoutMs(int timeoutMs) { if (timeoutMs 0) throw new IllegalArgumentException(timeout 必须大于 0); this.timeoutMs timeoutMs; return this; } public Builder followRedirects(boolean follow) { this.followRedirects follow; return this; } // 最终构建可在此做整体校验 public HttpRequest build() { if (POST.equals(method) body null) throw new IllegalStateException(POST 请求必须提供 body); return new HttpRequest(this); } } }调用方public class Main { public static void main(String[] args) { // 简单 GET 请求只填必要参数 HttpRequest get new HttpRequest.Builder(GET, https://api.example.com/users) .header(Authorization, Bearer token123) .timeoutMs(5000) .build(); // 完整 POST 请求 HttpRequest post new HttpRequest.Builder(POST, https://api.example.com/users) .header(Content-Type, application/json) .header(Authorization, Bearer token123) .body({\name\: \张三\, \age\: 28}) .timeoutMs(8000) .followRedirects(false) .build(); System.out.println(get); System.out.println(post); // 校验生效POST 不传 body 会抛异常 try { new HttpRequest.Builder(POST, https://api.example.com/users).build(); } catch (IllegalStateException e) { System.out.println(捕获异常: e.getMessage()); } } }输出HttpRequest{ methodGET urlhttps://api.example.com/users headers{AuthorizationBearer token123} bodynull timeout5000ms followRedirectstrue } HttpRequest{ methodPOST urlhttps://api.example.com/users headers{Content-Typeapplication/json, AuthorizationBearer token123} body{name: 张三, age: 28} timeout8000ms followRedirectsfalse } 捕获异常: POST 请求必须提供 body建造者的三个关键设计决策必填参数放构造器选填参数放链式方法// 必填放构造器缺了连 Builder 都建不出来 new Builder(POST, https://...) // 选填放链式方法不调就用默认值 .timeoutMs(5000) .body(...)这比把所有参数都堆进build()要好IDE 会直接提示你哪些字段必须填。校验逻辑放build()而不是产品类build()是构造的最后一步此时所有参数都已收集完毕可以做跨字段的整体校验比如POST 必须有 body这种单字段校验做不到的约束。产品类的构造器只负责赋值保持简单。产品类字段全部final通过 Builder 构造出来的对象是完整的、不可变的构造完成后没有任何方式能修改它的状态天然线程安全也避免了对象被意外篡改。优缺点优点链式调用可读性强每个参数都有名字一眼看清在配置什么必填参数通过构造器强制保证选填参数有合理默认值build()时集中校验构造失败在最早的时间点抛出产品对象可以是完全不可变的缺点代码量翻倍——每个需要 Builder 的类都要维护一个镜像结构的内部类参数极少23个且全部必填时完全不必要直接构造器更简洁如果产品类字段很多Builder 类本身也会变得很长适用场景判断参数超过 4 个、或者有选填参数、或者参数之间有约束关系就值得引入 Builder。Java 生态里OkHttpClient、Retrofit、AlertDialogAndroid、ProcessBuilder都是经典的 Builder 应用。Lombok 的Builder注解可以自动生成这套代码实际项目里能省不少样板代码。

相关新闻

警惕“伪DPO陷阱”:2026奇点大会权威认证的5项AI原生偏好对齐黄金指标(含ROC-AUC@Preference阈值校验表)

警惕“伪DPO陷阱”:2026奇点大会权威认证的5项AI原生偏好对齐黄金指标(含ROC-AUC@Preference阈值校验表)

更多请点击: https://codechina.net 第一章:AI原生DPO方法应用:2026奇点智能技术大会Direct Preference Optimization Direct Preference Optimization(DPO)正从传统RLHF的替代方案,演进为AI原生架构下的核…

2026/6/24 19:44:02阅读更多 →
车企需求验证:smart - mqtt 高可用比性能更重要

车企需求验证:smart - mqtt 高可用比性能更重要

突发!车企需求验证:smart - mqtt 高可用比性能更重要 在维护 [smart - mqtt] 的这些年,常有人问:“这个 Broker 单机能支撑多少连接?”说实话,这问题不好答,不同业务场景和硬件配置,…

2026/6/24 21:24:08阅读更多 →
为什么92%的SITS 2026部署环境未通过对抗压力测试?3个被忽视的架构漏洞与修复优先级清单

为什么92%的SITS 2026部署环境未通过对抗压力测试?3个被忽视的架构漏洞与修复优先级清单

更多请点击: https://kaifayun.com 第一章:AI原生对抗攻击防御:SITS 2026模型鲁棒性提升策略 SITS 2026 是面向AI原生场景设计的轻量级鲁棒训练框架,专为抵御输入空间与特征空间协同扰动而构建。其核心创新在于将对抗样本生成、梯…

2026/6/23 19:15:42阅读更多 →
MPC862程序流追踪与硬件调试:从原理到实战解决嵌入式通信系统难题

MPC862程序流追踪与硬件调试:从原理到实战解决嵌入式通信系统难题

1. MPC862程序流追踪:从硬件原理到实战调试在嵌入式通信系统的开发里,最让人头疼的莫过于程序“跑飞”了。你看着板子上的指示灯乱闪,串口输出一堆乱码,但就是不知道CPU到底执行了哪条指令、在哪个分支上出了问题。尤其是在像MPC8…

2026/6/24 23:23:10阅读更多 →
基于Tor Hidden Service的匿名通信系统Ricochet架构深度解析

基于Tor Hidden Service的匿名通信系统Ricochet架构深度解析

1. 项目概述:为什么我们需要一个“终极”匿名通信方案?在数字世界里,隐私和匿名性正变得越来越奢侈。我们每天使用的即时通讯工具,无论是微信、Telegram还是Signal,都在不同程度上依赖于中心化的服务器。这意味着&…

2026/6/24 23:23:10阅读更多 →
多重冒号(::)在编程中的核心作用:从命名空间到代码组织

多重冒号(::)在编程中的核心作用:从命名空间到代码组织

1. 项目概述:从“多重冒号”到代码的优雅表达最近在代码审查和开源项目里,我时不时会看到一个叫“Multiple-Colon”的讨论点。乍一看这个标题,你可能会有点懵:冒号不就是个标点吗,还能玩出什么花样?但如果你…

2026/6/24 23:23:10阅读更多 →
LINPACK基准测试:从原理到实战,全面解析HPC性能评估金标准

LINPACK基准测试:从原理到实战,全面解析HPC性能评估金标准

1. 项目概述:从“超级计算机的标尺”到“无处不在的性能度量”如果你在服务器、高性能计算(HPC)甚至个人电脑的评测里,看到过“双精度浮点性能达到XX TFlops”这样的描述,那背后十有八九站着LINPACK的身影。LINPACK Be…

2026/6/24 23:23:10阅读更多 →
OpenClaw:面向业务流程的智能体操作系统架构解析

OpenClaw:面向业务流程的智能体操作系统架构解析

1. OpenClaw 不是“另一个 Agent 框架”,而是面向真实业务流的智能体操作系统 你点开 GitHub 上 OpenClaw 的 README,第一眼看到的不是“支持多模型”“内置 20 Skill”,而是一张带虚线边框的三层架构图:最上层写着 Business Fl…

2026/6/24 23:23:10阅读更多 →
Claude Code Auto Mode:CLI驱动的VS Code智能协同范式

Claude Code Auto Mode:CLI驱动的VS Code智能协同范式

1. Auto Mode不是“全自动”,而是Claude Code里最被误解的交互范式很多人第一次看到“Claude Code Auto Mode”这个名称,下意识就联想到“代码全自动生成”“不用敲一个字就能跑通项目”——我刚接触时也这么想。结果在VS Code里点开Auto Mode&#xff0…

2026/6/24 23:18:07阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/24 7:33:03阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/24 2:12:09阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/24 7:37:00阅读更多 →