编程自学指南:java程序设计开发,Java 建造者模式详解课件
一、课程信息
学习目标
- 理解建造者模式的核心思想:分步构建复杂对象
- 掌握四大核心角色的设计方法
- 能通过建造者模式优化对象创建,处理可选参数
- 区分建造者与工厂模式的适用场景
二、课程导入:生活中的 "组装"
🌰 场景 1:组装电脑
- 传统方式:通过构造器一次性传入所有参数(CPU、内存、硬盘...)
java
new Computer("i7", "16G", "512G SSD", "RTX3060"); // 参数顺序易混淆
- 问题:参数多且有可选配置时,构造器臃肿
- 建造者方案:分步设置配置,最后统一组装
三、核心概念与角色
1. 模式定义
将一个复杂对象的构建过程与其表示分离,允许同样的构建过程创建不同的表示。
核心:通过分步设置参数,统一组装对象
2. 四大核心角色
角色名称 | 作用 | 电脑组装案例 |
---|---|---|
产品 | 复杂对象(最终要创建的对象) | Computer 类 |
抽象建造者 | 声明构建步骤的抽象方法 | ComputerBuilder 接口 |
具体建造者 | 实现构建步骤,提供获取产品的方法 | HighEndBuilder 、BudgetBuilder |
指挥者 | 控制构建流程(可选) | Director 类(组装流程控制) |
四、基础实现与案例
🔧 案例 1:电脑组装(基础版)
步骤 1:定义产品类
class Computer {
private String cpu;
private String ram;
private String disk;
private String gpu;
// 私有构造器,只能通过建造者创建
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.disk = builder.disk;
this.gpu = builder.gpu;
}
// 省略getter和toString
}
步骤 2:定义建造者(静态内部类)
static class Builder {
private String cpu;
private String ram = "8G"; // 默认值
private String disk = "256G SSD";
private String gpu;
public Builder setCpu(String cpu) {
this.cpu = cpu;
return this; // 支持链式调用
}
public Builder setGpu(String gpu) {
this.gpu = gpu;
return this;
}
public Computer build() {
// 校验必要参数
if (cpu == null) {
throw new IllegalStateException("CPU是必需的");
}
return new Computer(this);
}
}
步骤 3:客户端使用
Computer highEnd = new Computer.Builder()
.setCpu("i9")
.setRam("32G")
.setDisk("1T SSD")
.setGpu("RTX4090")
.build();
Computer budget = new Computer.Builder()
.setCpu("i5")
.build(); // 使用默认内存和硬盘
🔍 建造者模式优势
- 参数可选:可选参数通过 setter 设置,必选参数在 build 时校验
- 可读性:参数含义明确,避免构造器参数顺序错误
- 扩展性:新增参数只需修改建造者,不影响已有代码
五、进阶:链式调用与流式 API
案例 2:用户注册(可选参数处理)
class User {
private final String username;
private final String password;
private final int age;
private final String email;
private User(Builder builder) {
this.username = builder.username;
this.password = builder.password;
this.age = builder.age;
this.email = builder.email;
}
// 建造者链式调用
public static class Builder {
private final String username;
private final String password;
private int age = 18;
private String email;
public Builder(String username, String password) {
this.username = username;
this.password = password;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
public User build() {
return new User(this);
}
}
}
客户端调用(流式风格)
User user = new User.Builder("张三", "123456")
.age(20)
.email("zhangsan@example.com")
.build();
六、建造者 vs 工厂模式
特性 | 工厂模式 | 建造者模式 |
---|---|---|
创建方式 | 直接生成对象 | 分步设置参数后生成 |
适用对象 | 简单对象 | 复杂对象(多参数、可选参数) |
核心 | 对象创建抽象化 | 构建过程与表示分离 |
七、JDK 中的建造者模式
1. StringBuilder
new StringBuilder()
.append("Hello")
.append(" ")
.append("World")
.toString(); // 最终构建String对象
2. Calendar
类
Calendar.getInstance()
.set(2023, Calendar.OCTOBER, 1); // 分步设置时间
八、适用场景与优缺点
✅ 优点
- 复杂对象构建清晰:分步操作,逻辑分明
- 默认值支持:可选参数可设置默认值
- 线程安全:构建过程与对象使用分离
⚠️ 缺点
- 类数量增加:每个产品需对应一个建造者
- 过度设计:简单对象使用会增加代码复杂度
🔥 适用场景
- 参数众多的对象:如 SQL 查询条件、HTTP 请求参数
- 不可变对象构建:确保对象创建后不可修改(如
User
类字段用final
)
九、课堂练习
练习 1:优化手机配置
需求:
Phone
类包含brand
、cpu
、ram
、battery
(电池容量)- 使用建造者模式,
brand
和cpu
为必选参数,其他为可选
练习 2:实现不可变的Order
类
要求:
- 订单包含
orderId
、userId
、amount
、status
(状态) - 通过建造者模式创建,创建后字段不可修改
十、课程总结
知识图谱:
建造者模式
↳ 核心:分步构建,分离构建与表示
↳ 角色:产品、建造者、指挥者(可选)
↳ 优势:参数可选、可读性强、易扩展
↳ 与工厂区别:处理复杂对象 vs 简单对象
口诀记忆:
“建造者,分步造,复杂对象不用愁,
链式调用参数明,必选可选分得清,
最后 build 来组装,对象创建更优雅!”
十一、课后作业
必做 1:实现图书信息建造者
需求:
Book
类包含title
、author
、price
、publisher
(出版社)- 使用建造者模式,
title
和author
为必选,其他可选
必做 2:分析 Lombok 的 @Builder 注解
任务:
- 引入 Lombok 依赖,用
@Builder
注解简化建造者实现 - 对比手写建造者与 Lombok 生成代码的差异