我是摘星,一名全栈开发者,专注 Java后端开发、AI工程化 与 云计算架构 领域,擅长Python技术栈。热衷于探索前沿技术,包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践,乐于分享实战经验与学习心得,希望用通俗易懂的方式帮助开发者快速掌握核心技术。持续输出AI、云计算及开源技术相关内容,欢迎关注交流!
在软件开发中,当遇到需要创建包含多个组成部分的复杂对象时(如HTML文档、汽车配置、订单系统等),传统构造方法面临三大痛点:
根据GitHub 2023年代码分析统计,建造者模式在以下场景使用率最高:
建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。其核心组件包括:
角色 | 职责说明 |
---|---|
Director | 控制构建过程的主管类 |
Builder | 抽象构建接口 |
ConcreteBuilder | 具体构建实现 |
Product | 最终生成的复杂对象 |
图1:建造者模式类图 - 展示主管、构建器与产品的协作关系
图2:建造者模式时序图 - 分步骤构建复杂对象的过程
// 产品类
class Car {
private String engine;
private int wheels;
private String color;
// 设置方法省略...
public void showSpecs() {
System.out.printf("Engine: %s, Wheels: %d, Color: %s\n",
engine, wheels, color);
}
}
// 抽象建造者
interface CarBuilder {
void buildEngine();
void buildWheels();
void paintColor();
Car getResult();
}
// 具体建造者
class SportsCarBuilder implements CarBuilder {
private Car car = new Car();
@Override
public void buildEngine() {
car.setEngine("V8 Twin-Turbo");
}
@Override
public void buildWheels() {
car.setWheels(4);
}
@Override
public void paintColor() {
car.setColor("Racing Red");
}
@Override
public Car getResult() {
return car;
}
}
// 主管类
class Mechanic {
public Car construct(CarBuilder builder) {
builder.buildEngine();
builder.buildWheels();
builder.paintColor();
return builder.getResult();
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
Mechanic mechanic = new Mechanic();
CarBuilder builder = new SportsCarBuilder();
Car myCar = mechanic.construct(builder);
myCar.showSpecs();
}
}
public class User {
private final String firstName; // 必选
private final String lastName; // 必选
private final int age; // 可选
private final String phone; // 可选
private User(UserBuilder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.phone = builder.phone;
}
public static class UserBuilder {
private final String firstName;
private final String lastName;
private int age = 0;
private String phone = "";
public UserBuilder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public User build() {
// 验证必填字段
if (firstName == null || lastName == null) {
throw new IllegalStateException("必填字段缺失");
}
return new User(this);
}
}
}
// 使用示例
User user = new User.UserBuilder("张", "三")
.age(30)
.phone("13800138000")
.build();
图3:行业应用分布图 - 配置管理占据最大比例
// StringBuilder就是建造者模式的变体
String html = new StringBuilder()
.append("<html>")
.append("<head><title>Builder Demo</title></head>")
.append("<body>")
.append("<h1>Hello World</h1>")
.append("</body>")
.append("</html>")
.toString();
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.rootBeanDefinition(MyService.class)
.addPropertyValue("host", "192.168.1.1")
.setInitMethodName("init")
.setScope(BeanDefinition.SCOPE_SINGLETON);
BeanDefinition beanDefinition = builder.getBeanDefinition();
@Builder
public class Order {
private String orderId;
private List<String> items;
private double totalPrice;
}
// 自动生成建造者
Order order = Order.builder()
.orderId("ORD-2023-001")
.items(Arrays.asList("Item1", "Item2"))
.totalPrice(99.99)
.build();
图4:优缺点分析图
对比维度 | 建造者模式 | 工厂模式 |
---|---|---|
构造目标 | 多部分组成的复杂对象 | 单个标准产品 |
构造过程 | 分步骤构造 | 一步构造完成 |
关注重点 | 对象的组装过程 | 对象的创建行为 |
适用场景 | 参数可选且组合复杂 | 固定结构的简单对象 |
对比维度 | 建造者模式 | 抽象工厂模式 |
---|---|---|
产品数量 | 构建单个复杂对象 | 创建多个相关对象族 |
构造方式 | 分步骤渐进式构建 | 一次性创建完整产品族 |
核心目标 | 控制复杂对象的构造过程 | 保证产品族的兼容性 |
// 建造者+原型模式
public CarBuilder setPrototype(Car prototype) {
this.car = prototype.clone();
return this;
}
public static UserBuilder adminUser() {
return new UserBuilder("admin", "system")
.age(30)
.phone("10086");
}
建造者模式作为创建型设计模式的重要成员:
随着领域驱动设计(DDD)的普及,建造者模式在值对象构建和聚合根创建领域展现出新的价值。当系统需要处理具有复杂构造逻辑的业务对象时,它仍然是不可替代的解决方案。
权威参考: