【设计模式】创建型-建造者模式

文章目录

  • 前言
  • 一、概念
  • 二、核心思想
  • 三、Java代码实现
    • [1. 定义产品(汽车类,复杂对象)](#1. 定义产品(汽车类,复杂对象))
    • [2. 定义抽象建造者(汽车建造者接口)](#2. 定义抽象建造者(汽车建造者接口))
    • [3. 定义具体建造者(家用轿车建造者+SUV建造者)](#3. 定义具体建造者(家用轿车建造者+SUV建造者))
    • [4. 定义指挥者(汽车构建指挥者)](#4. 定义指挥者(汽车构建指挥者))
    • [5. 客户端使用代码](#5. 客户端使用代码)
    • [6. 扩展:新增新能源汽车(符合开闭原则)](#6. 扩展:新增新能源汽车(符合开闭原则))
  • 四、优缺点
    • [1. 优点](#1. 优点)
    • [2. 缺点](#2. 缺点)
  • 五、应用场景
  • 六、注意事项
  • 总结

前言

在AI时代,代码的编写可以被大模型辅助甚至替代,但程序员真正的核心竞争力是技术思维------设计模式这类沉淀了数十年的"内功心法",决定了代码的可维护性、扩展性和稳定性,是AI无法完全替代的核心能力。建造者模式作为创建型模式的重要成员,专注于"复杂对象的分步构建",解决了复杂对象创建时参数繁多、构建逻辑混乱的问题,是构建复杂实例的最优范式之一。

一、概念

建造者模式(Builder Pattern)是一种创建型设计模式,核心目标是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。简单来说,就是把复杂对象的创建步骤拆解开来,一步一步逐步构建,最终组装出完整的对象,同时隐藏对象的构建细节。

比如建造一辆汽车,需要组装发动机、底盘、车身、轮胎等多个部件,且不同型号的汽车(如家用轿车、SUV)部件规格不同,但构建步骤(组装顺序)基本一致。建造者模式就可以将"部件组装步骤"与"具体部件选择"分离,通过不同的建造者,用相同的步骤构建出不同的汽车。

二、核心思想

  1. 产品(Product):需要构建的复杂对象,包含多个组成部件,是最终被返回的结果;
  2. 抽象建造者(Abstract Builder):定义构建产品的抽象方法(对应各个部件的构建步骤),同时提供一个返回最终产品的方法;
  3. 具体建造者(Concrete Builder):实现抽象建造者的方法,具体完成每个部件的构建,定义并组装出特定的产品;
  4. 指挥者(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. 优点

  1. 解耦构建流程与部件实现:指挥者控制流程,建造者实现部件,流程与具体实现分离,修改部件或流程互不影响;
  2. 灵活性高:新增产品时,只需新增具体建造者,无需修改指挥者和原有代码,符合开闭原则;
  3. 隐藏构建细节:客户端只需指定具体建造者,无需知道对象的构建步骤和部件细节,降低使用难度;
  4. 便于控制构建过程:分步构建复杂对象,可灵活调整构建步骤,或在步骤中添加额外逻辑(如部件校验)。

2. 缺点

  1. 类数量膨胀:每新增一种产品,需新增一个具体建造者,若产品种类多,会导致系统类数量增多;
  2. 复杂度增加:相比直接new对象,引入了抽象建造者、具体建造者、指挥者,增加了系统的抽象度和理解成本;
  3. 适用场景有限:仅适用于"复杂对象、构建步骤固定"的场景,简单对象(仅需少量参数)使用建造者模式会过度设计。

五、应用场景

建造者模式适用于复杂对象、构建步骤固定、需灵活切换产品表示的场景:

  1. 复杂对象构建:如汽车、电脑、手机等包含多个部件的复杂产品,需分步组装;
  2. 参数繁多的对象创建:如实体类(POJO)有多个属性(尤其是可选属性),用建造者模式避免构造方法参数过多( telescoping constructor 反模式);
  3. 框架中的应用:Java中的StringBuilder(append方法分步构建字符串)、MyBatis的SqlSessionFactoryBuilder(分步构建SqlSessionFactory);
  4. 需统一构建流程的场景:如不同类型的报表(Excel报表、PDF报表),构建流程一致(获取数据→处理数据→生成报表),但具体实现不同。

六、注意事项

  1. 区分建造者模式与抽象工厂模式:抽象工厂关注"产品族的创建",建造者关注"单个复杂产品的分步构建";抽象工厂返回产品族,建造者返回单个完整产品;
  2. 简化指挥者(可选):若构建流程简单,可省略指挥者,由客户端直接调用建造者的方法控制流程(如StringBuilder无指挥者);
  3. 避免过度设计:简单对象(如仅3-4个属性)无需使用建造者模式,直接用构造方法或setter方法更简洁;
  4. 建造者的单一职责:每个具体建造者只负责一种产品的构建,避免一个建造者构建多种产品导致逻辑混乱。

总结

  1. 建造者模式核心是将复杂对象的构建与表示分离,通过"抽象建造者+具体建造者+指挥者"的结构,实现分步构建、灵活扩展;
  2. 优势是解耦流程与实现、灵活性高、隐藏细节,缺点是类数量膨胀、复杂度增加,适用于复杂对象的构建;
  3. 实际开发中,StringBuilder是建造者模式的极简实现(无抽象建造者和指挥者),MyBatis的Builder体系则是建造者模式的经典应用,可重点参考。
相关推荐
szm02251 天前
设计模式-
设计模式
砍光二叉树1 天前
【设计模式】创建型-抽象工厂模式
设计模式·抽象工厂模式
砍光二叉树1 天前
【设计模式】创建型-工厂方法模式
设计模式·工厂方法模式
我爱学习_zwj1 天前
设计模式-2(单例模式与原型模式)
前端·javascript·设计模式
砍光二叉树1 天前
【设计模式】创建型-单例模式
单例模式·设计模式
我爱学习_zwj1 天前
设计模式-3(装饰器模式)
前端·设计模式·装饰器模式
文心快码BaiduComate2 天前
Comate内置模型已支持 MiniMax-M2.7!
设计模式·程序员·前端框架
console.log('npc')2 天前
Cursor,Trae,Claude Code如何协作生产出一套前后台app?
前端·人工智能·react.js·设计模式·ai·langchain·ai编程
czxyvX2 天前
C++ - 基于多设计模式下的同步&异步日志系统
c++·设计模式