文章目录
- 前言
- 一、概念
- 二、核心思想
- 三、Java代码实现
-
- [1. 定义产品(汽车类,复杂对象)](#1. 定义产品(汽车类,复杂对象))
- [2. 定义抽象建造者(汽车建造者接口)](#2. 定义抽象建造者(汽车建造者接口))
- [3. 定义具体建造者(家用轿车建造者+SUV建造者)](#3. 定义具体建造者(家用轿车建造者+SUV建造者))
- [4. 定义指挥者(汽车构建指挥者)](#4. 定义指挥者(汽车构建指挥者))
- [5. 客户端使用代码](#5. 客户端使用代码)
- [6. 扩展:新增新能源汽车(符合开闭原则)](#6. 扩展:新增新能源汽车(符合开闭原则))
- 四、优缺点
-
- [1. 优点](#1. 优点)
- [2. 缺点](#2. 缺点)
- 五、应用场景
- 六、注意事项
- 总结
前言
在AI时代,代码的编写可以被大模型辅助甚至替代,但程序员真正的核心竞争力是技术思维------设计模式这类沉淀了数十年的"内功心法",决定了代码的可维护性、扩展性和稳定性,是AI无法完全替代的核心能力。建造者模式作为创建型模式的重要成员,专注于"复杂对象的分步构建",解决了复杂对象创建时参数繁多、构建逻辑混乱的问题,是构建复杂实例的最优范式之一。
一、概念
建造者模式(Builder Pattern)是一种创建型设计模式,核心目标是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。简单来说,就是把复杂对象的创建步骤拆解开来,一步一步逐步构建,最终组装出完整的对象,同时隐藏对象的构建细节。
比如建造一辆汽车,需要组装发动机、底盘、车身、轮胎等多个部件,且不同型号的汽车(如家用轿车、SUV)部件规格不同,但构建步骤(组装顺序)基本一致。建造者模式就可以将"部件组装步骤"与"具体部件选择"分离,通过不同的建造者,用相同的步骤构建出不同的汽车。
二、核心思想
- 产品(Product):需要构建的复杂对象,包含多个组成部件,是最终被返回的结果;
- 抽象建造者(Abstract Builder):定义构建产品的抽象方法(对应各个部件的构建步骤),同时提供一个返回最终产品的方法;
- 具体建造者(Concrete Builder):实现抽象建造者的方法,具体完成每个部件的构建,定义并组装出特定的产品;
- 指挥者(Director):负责调用抽象建造者的构建方法,控制整个构建流程(步骤顺序),不直接参与部件的构建,仅协调步骤。
建造者模式的核心本质是分步构建、解耦流程与实现 ------将复杂对象的构建步骤标准化,具体部件的实现交给具体建造者,指挥者控制流程,从而实现"同一流程,不同产品",同时降低复杂对象创建的复杂度。
三、Java代码实现
以"汽车建造"场景为例:系统需要支持家用轿车和SUV两种车型的构建,两种车型都包含发动机、底盘、车身、轮胎四个核心部件,构建步骤一致(先装发动机→底盘→车身→轮胎),用建造者模式实现分步构建与解耦。
1. 定义产品(汽车类,复杂对象)
java
/**
* 产品:汽车
* 包含多个部件,是最终要构建的复杂对象
*/
public class Car {
// 汽车部件
private String engine; // 发动机
private String chassis; // 底盘
private String body; // 车身
private String tire; // 轮胎
// 无参构造(供建造者使用)
public Car() {}
// setter方法(建造者用于设置各个部件)
public void setEngine(String engine) {
this.engine = engine;
}
public void setChassis(String chassis) {
this.chassis = chassis;
}
public void setBody(String body) {
this.body = body;
}
public void setTire(String tire) {
this.tire = tire;
}
// 展示汽车信息(验证构建结果)
public void showCarInfo() {
System.out.println("汽车配置:");
System.out.println("发动机:" + engine);
System.out.println("底盘:" + chassis);
System.out.println("车身:" + body);
System.out.println("轮胎:" + tire);
}
}
2. 定义抽象建造者(汽车建造者接口)
java
/**
* 抽象建造者:汽车建造者接口
* 定义汽车各个部件的构建方法,以及返回最终产品的方法
*/
public interface CarBuilder {
// 构建发动机
void buildEngine();
// 构建底盘
void buildChassis();
// 构建车身
void buildBody();
// 构建轮胎
void buildTire();
// 返回构建完成的汽车(产品)
Car getCar();
}
3. 定义具体建造者(家用轿车建造者+SUV建造者)
java
/**
* 具体建造者1:家用轿车建造者
* 实现抽象建造者,构建家用轿车的具体部件
*/
public class SedanCarBuilder implements CarBuilder {
// 持有一个汽车对象,逐步构建
private Car car = new Car();
@Override
public void buildEngine() {
car.setEngine("1.5T 涡轮增压发动机(家用型)");
}
@Override
public void buildChassis() {
car.setChassis("舒适型底盘(适配城市道路)");
}
@Override
public void buildBody() {
car.setBody("三厢轿车车身(流线型设计)");
}
@Override
public void buildTire() {
car.setTire("17英寸舒适型轮胎");
}
@Override
public Car getCar() {
return car; // 返回构建完成的家用轿车
}
}
/**
* 具体建造者2:SUV建造者
* 实现抽象建造者,构建SUV的具体部件
*/
public class SuvCarBuilder implements CarBuilder {
private Car car = new Car();
@Override
public void buildEngine() {
car.setEngine("2.0T 涡轮增压发动机(越野型)");
}
@Override
public void buildChassis() {
car.setChassis("越野型底盘(高离地间隙)");
}
@Override
public void buildBody() {
car.setBody("SUV车身(大空间、高视野)");
}
@Override
public void buildTire() {
car.setTire("19英寸越野型轮胎");
}
@Override
public Car getCar() {
return car; // 返回构建完成的SUV
}
}
4. 定义指挥者(汽车构建指挥者)
java
/**
* 指挥者:汽车构建指挥者
* 控制汽车的构建流程(步骤顺序),调用建造者的方法完成构建
*/
public class CarDirector {
// 持有抽象建造者,依赖抽象而非具体
private CarBuilder carBuilder;
// 构造方法注入建造者(灵活切换具体建造者)
public CarDirector(CarBuilder carBuilder) {
this.carBuilder = carBuilder;
}
// 控制构建流程:固定步骤(发动机→底盘→车身→轮胎)
public Car constructCar() {
carBuilder.buildEngine();
carBuilder.buildChassis();
carBuilder.buildBody();
carBuilder.buildTire();
return carBuilder.getCar(); // 构建完成,返回产品
}
}
5. 客户端使用代码
java
/**
* 客户端:汽车订购系统
* 只需指定具体建造者,由指挥者控制构建流程,无需关心细节
*/
public class Client {
public static void main(String[] args) {
// 1. 构建家用轿车
CarBuilder sedanBuilder = new SedanCarBuilder();
CarDirector sedanDirector = new CarDirector(sedanBuilder);
Car sedan = sedanDirector.constructCar();
System.out.println("=== 家用轿车 ===");
sedan.showCarInfo();
// 2. 构建SUV(切换建造者,流程不变)
CarBuilder suvBuilder = new SuvCarBuilder();
CarDirector suvDirector = new CarDirector(suvBuilder);
Car suv = suvDirector.constructCar();
System.out.println("\n=== SUV ===");
suv.showCarInfo();
}
}
输出结果:
=== 家用轿车 ===
汽车配置:
发动机:1.5T 涡轮增压发动机(家用型)
底盘:舒适型底盘(适配城市道路)
车身:三厢轿车车身(流线型设计)
轮胎:17英寸舒适型轮胎
=== SUV ===
汽车配置:
发动机:2.0T 涡轮增压发动机(越野型)
底盘:越野型底盘(高离地间隙)
车身:SUV车身(大空间、高视野)
轮胎:19英寸越野型轮胎
6. 扩展:新增新能源汽车(符合开闭原则)
java
// 1. 新增具体建造者:新能源汽车建造者
public class NewEnergyCarBuilder implements CarBuilder {
private Car car = new Car();
@Override
public void buildEngine() {
car.setEngine("永磁同步电机(新能源专用)");
}
@Override
public void buildChassis() {
car.setChassis("新能源专用底盘(适配电池布局)");
}
@Override
public void buildBody() {
car.setBody("新能源轿车车身(轻量化设计)");
}
@Override
public void buildTire() {
car.setTire("18英寸低滚阻轮胎");
}
@Override
public Car getCar() {
return car;
}
}
// 2. 客户端使用(无需修改原有代码,仅新增建造者并传入指挥者)
public class Client {
public static void main(String[] args) {
// 新增:构建新能源汽车
CarBuilder newEnergyBuilder = new NewEnergyCarBuilder();
CarDirector newEnergyDirector = new CarDirector(newEnergyBuilder);
Car newEnergyCar = newEnergyDirector.constructCar();
System.out.println("\n=== 新能源汽车 ===");
newEnergyCar.showCarInfo();
}
}
四、优缺点
1. 优点
- 解耦构建流程与部件实现:指挥者控制流程,建造者实现部件,流程与具体实现分离,修改部件或流程互不影响;
- 灵活性高:新增产品时,只需新增具体建造者,无需修改指挥者和原有代码,符合开闭原则;
- 隐藏构建细节:客户端只需指定具体建造者,无需知道对象的构建步骤和部件细节,降低使用难度;
- 便于控制构建过程:分步构建复杂对象,可灵活调整构建步骤,或在步骤中添加额外逻辑(如部件校验)。
2. 缺点
- 类数量膨胀:每新增一种产品,需新增一个具体建造者,若产品种类多,会导致系统类数量增多;
- 复杂度增加:相比直接new对象,引入了抽象建造者、具体建造者、指挥者,增加了系统的抽象度和理解成本;
- 适用场景有限:仅适用于"复杂对象、构建步骤固定"的场景,简单对象(仅需少量参数)使用建造者模式会过度设计。
五、应用场景
建造者模式适用于复杂对象、构建步骤固定、需灵活切换产品表示的场景:
- 复杂对象构建:如汽车、电脑、手机等包含多个部件的复杂产品,需分步组装;
- 参数繁多的对象创建:如实体类(POJO)有多个属性(尤其是可选属性),用建造者模式避免构造方法参数过多( telescoping constructor 反模式);
- 框架中的应用:Java中的StringBuilder(append方法分步构建字符串)、MyBatis的SqlSessionFactoryBuilder(分步构建SqlSessionFactory);
- 需统一构建流程的场景:如不同类型的报表(Excel报表、PDF报表),构建流程一致(获取数据→处理数据→生成报表),但具体实现不同。
六、注意事项
- 区分建造者模式与抽象工厂模式:抽象工厂关注"产品族的创建",建造者关注"单个复杂产品的分步构建";抽象工厂返回产品族,建造者返回单个完整产品;
- 简化指挥者(可选):若构建流程简单,可省略指挥者,由客户端直接调用建造者的方法控制流程(如StringBuilder无指挥者);
- 避免过度设计:简单对象(如仅3-4个属性)无需使用建造者模式,直接用构造方法或setter方法更简洁;
- 建造者的单一职责:每个具体建造者只负责一种产品的构建,避免一个建造者构建多种产品导致逻辑混乱。
总结
- 建造者模式核心是将复杂对象的构建与表示分离,通过"抽象建造者+具体建造者+指挥者"的结构,实现分步构建、灵活扩展;
- 优势是解耦流程与实现、灵活性高、隐藏细节,缺点是类数量膨胀、复杂度增加,适用于复杂对象的构建;
- 实际开发中,StringBuilder是建造者模式的极简实现(无抽象建造者和指挥者),MyBatis的Builder体系则是建造者模式的经典应用,可重点参考。