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

Java设计模式之创建型—建造者模式

Java中最常用的设计模式-CSDN博客

“把对象的构造步骤拆成链式方法,调用者按需填参,最后一次性 build,避免构造函数爆炸。”

  1. 经典场景

  • 参数多(>4 个)且大部分可选

  • 需要不可变对象(final 字段)

  • 避免伸缩构造函数(telescoping constructor)

模板代码

public final class User {// ① 所有字段 final,不可变private final String name;private final int age;private final String phone;// ② 私有构造,只接受 Builderprivate User(Builder builder) {this.name  = builder.name;this.age   = builder.age;this.phone = builder.phone;}// ③ 静态内部 Builderpublic static class Builder {private String name;   // 必填private int age = -1;  // 可选默认值private String phone;public Builder(String name) { this.name = name; }public Builder age(int age)   { this.age = age; return this; }public Builder phone(String p){ this.phone = p; return this; }public User build() {// 参数校验放这里if (age < 0) throw new IllegalArgumentException("age missing");return new User(this);}}// ④ Getter(无 Setter)public String name()  { return name; }public int age()      { return age; }public String phone() { return phone; }
}

客户端链式调用

User user = new User.Builder("Alice").age(18).phone("13800138000").build();
优点缺点
可读性高,链式流畅多写 1 个 Builder 类
不可变,线程安全不适合参数极少或极多的极端场景
可在 build() 里集中校验

Lombok 一行搞定

@Builder
public class User {private final String name;private final int age;private final String phone;
}

使用框架

系统源码级(AOSP 自带)

典型链式调用说明
AlertDialog.Buildernew Builder(context).setTitle(..).setPositiveButton(..).show()官方最经典示例

主流三方库(日常必用)

建造者入口场景
OkHttpnew OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).build()网络参数多
Retrofitnew Retrofit.Builder().baseUrl("https://api.xxx/").addConverterFactory(..).build()接口配置
GlideGlide.with(this).load(url).placeholder(R.drawable.loading).into(imageView)图片加载链式 DSL
http://www.dtcms.com/a/365576.html

相关文章:

  • 零基础学英语APP推荐:一个程序员的亲测有效逆袭攻略
  • 普通人也能走的自由之路
  • 限流、降级、熔断的区别和应用场景
  • 9月3日星期三今日早报简报微语报早读
  • 多路复用 I/O 函数——`select`函数
  • SystemServer 启动流程
  • EDVAC:现代计算机体系的奠基之作
  • 影像服务免费方案:GIS Server让GeoTIFF数据在山海鲸中直观呈现
  • PyTorch实战——ResNet与DenseNet详解
  • 关于嵌入式学习——嵌入式硬件2
  • Mac电脑Tomcat+Java项目中 代码更新但8080端口内容没有更新
  • 打破信息洪流:微算法科技(NASDAQ:MLGO)推出一种移动互联网环境下数字媒体热点挖掘算法
  • 01-Redis 发展简史与核心定位解析:从诞生到三大产品矩阵
  • 微信小程序预览和分享文件
  • 从检索的角度聊聊数据结构的演进​
  • Vue 评论组件设计 V1.0
  • 关于linux软件编程15——数据库编程sqlite3
  • Spring Boot配置error日志发送至企业微信
  • EI会议:第七届人工智能与先进制造国际会议(AIAM 2025)
  • 多智能体协作系统(CrewAI)
  • 素材合集!直播间带货音乐BGM合集,抖音直播间常用热门音乐合集,根据中文分类,方便查找
  • AI重塑SaaS:从被动工具到智能角色的技术演进路径
  • Shell 三剑客之 awk 命令详解(理论+实战)
  • Datawhale AI夏令营复盘[特殊字符]:我如何用一个Prompt,在Coze Space上“画”出一个商业级网页?
  • SDK介绍
  • MCP模型库哪个好?2025年收录12万+服务的AI智能体工具集成平台推荐
  • 面试复习题-kotlin
  • Springboot 练手项目(删除部门-接口开发)
  • Get the pikachu靶场SSRF漏洞 (windows环境)
  • AR技术赋能电力巡检:开启智能安全新时代