首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >设计模式教程:建造者模式

设计模式教程:建造者模式

作者头像
用户12001855
发布2026-01-20 15:54:49
发布2026-01-20 15:54:49
190
举报

建造者模式(Builder Pattern)是一种设计模式,属于创建型模式。它的主要目的是将一个复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。换句话说,建造者模式允许你一步步构建一个复杂的对象,同时避免构造过程中的各种冗杂细节。

1. 适用场景

当需要创建一个复杂对象时(对象内部有很多属性需要设定),而你又不希望通过构造函数传递大量的参数,或者通过不同的构造函数变种来创建时,建造者模式非常适用。它有助于提升代码的可读性和可维护性。

2. 组成部分

建造者模式通常包括以下几个角色:

  • Product(产品):最终构建出来的复杂对象。
  • Builder(建造者):定义了创建产品各个部件的步骤,但不同的建造者会有不同的实现。
  • ConcreteBuilder(具体建造者):实现Builder接口,定义了如何组装各个部件。
  • Director(指挥者):负责控制构建的流程。它会调用建造者提供的方法来构建产品。指挥者与具体建造者解耦。
  • Client(客户端):负责提供具体的建造者对象并请求构建过程。
3. 结构图
代码语言:javascript
复制
           +------------+
           |  Director |-------------------+
           +------------+                   |
                 |                         |
                 v                         v
           +------------+           +-------------------+
           |  Builder   |<----------| ConcreteBuilder   |
           +------------+           +-------------------+
                 |                         |
                 v                         v
           +-------------------+    +-----------------+
           |   Product         |    |   Product       |
           +-------------------+    +-----------------+
4. 举个例子:构建一辆车

假设我们要构建一辆复杂的车,每辆车可能有不同的属性,比如车轮、车门、引擎等。我们可以使用建造者模式来构建这辆车。

代码示例:
代码语言:javascript
复制
// 产品类:车
class Car {
    private String engine;
    private String wheels;
    private String doors;

    public void setEngine(String engine) {
        this.engine = engine;
    }

    public void setWheels(String wheels) {
        this.wheels = wheels;
    }

    public void setDoors(String doors) {
        this.doors = doors;
    }

    @Override
    public String toString() {
        return "Car [engine=" + engine + ", wheels=" + wheels + ", doors=" + doors + "]";
    }
}

// 建造者接口
interface CarBuilder {
    void buildEngine();
    void buildWheels();
    void buildDoors();
    Car getCar();
}

// 具体建造者1:Tesla车
class TeslaCarBuilder implements CarBuilder {
    private Car car;

    public TeslaCarBuilder() {
        this.car = new Car();
    }

    @Override
    public void buildEngine() {
        car.setEngine("Electric Engine");
    }

    @Override
    public void buildWheels() {
        car.setWheels("Tesla Wheels");
    }

    @Override
    public void buildDoors() {
        car.setDoors("4 Doors");
    }

    @Override
    public Car getCar() {
        return car;
    }
}

// 具体建造者2:BMW车
class BMWCarBuilder implements CarBuilder {
    private Car car;

    public BMWCarBuilder() {
        this.car = new Car();
    }

    @Override
    public void buildEngine() {
        car.setEngine("V6 Engine");
    }

    @Override
    public void buildWheels() {
        car.setWheels("BMW Wheels");
    }

    @Override
    public void buildDoors() {
        car.setDoors("4 Doors");
    }

    @Override
    public Car getCar() {
        return car;
    }
}

// 指挥者:构建过程
class Director {
    private CarBuilder builder;

    public Director(CarBuilder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.buildEngine();
        builder.buildWheels();
        builder.buildDoors();
    }

    public Car getCar() {
        return builder.getCar();
    }
}

// 客户端
public class Main {
    public static void main(String[] args) {
        CarBuilder teslaBuilder = new TeslaCarBuilder();
        Director director = new Director(teslaBuilder);
        director.construct();
        Car tesla = director.getCar();
        System.out.println(tesla);

        CarBuilder bmwBuilder = new BMWCarBuilder();
        director = new Director(bmwBuilder);
        director.construct();
        Car bmw = director.getCar();
        System.out.println(bmw);
    }
}

5. 运行结果:

代码语言:javascript
复制
Car [engine=Electric Engine, wheels=Tesla Wheels, doors=4 Doors]
Car [engine=V6 Engine, wheels=BMW Wheels, doors=4 Doors]
6. 总结
  • 优点
    • 可以使用不同的建造者构建不同的表示。
    • 通过一步步构建,避免了复杂的构造函数。
    • 可以使对象的构建过程更加灵活和可控制。
  • 缺点
    • 建造者模式通常需要多个类来进行分工和协调,增加了代码的复杂度。
    • 适合构建复杂对象,简单对象使用建造者模式可能显得有些“过于”复杂。

建造者模式尤其适用于构建层次复杂、参数众多的对象时,避免了大量的构造函数重载,能够提高代码的可读性和维护性。

版权声明
  1. 本文内容属于原创,欢迎转载,但请务必注明出处和作者,尊重原创版权。
  2. 转载时,请附带原文链接并注明“本文作者:扣丁梦想家
  3. 禁止未经授权的商业转载。

如果您有任何问题或建议,欢迎留言讨论。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 适用场景
  • 2. 组成部分
  • 3. 结构图
  • 4. 举个例子:构建一辆车
    • 代码示例:
  • 6. 总结
    • 版权声明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档