返回

用捏泥人理解建造者模式:轻松玩转设计模式

后端

建造者模式:神话与实践中的设计模式

什么是建造者模式?

想象女娲用泥巴创造人类的场景。在这个过程中,女娲扮演指挥者的角色,规划人类的基本形状和结构,并将构建任务分配给不同的人员。这些人员根据女娲的指导,分工完成人类的头部、躯干、四肢和其他细节,最终组装成完整的人类。

这种设计模式体现了建造者模式的本质。建造者模式将构建复杂对象的流程与对象的代码分开。它允许我们在不改变核心代码的情况下修改产品的结构或功能。

建造者模式的优点

  • 可维护性 :分离构建过程简化了产品的维护和扩展。
  • 可测试性 :建造者隔离了不同组件,使其更容易单独测试。
  • 可复用性 :不同的建造者可以创建具有不同配置和功能的同类型产品,提高代码可复用性。
  • 灵活性 :建造者模式允许轻松调整产品的构造方式,使其高度灵活和可变。

建造者模式的应用

建造者模式在现实开发中广泛应用于:

  • 创建复杂对象 :例如,创建具有多个组件的实体对象。
  • 创建具有不同配置的对象 :例如,创建具有不同规格的汽车或电脑。
  • 创建具有不同行为的对象 :例如,创建具有不同算法或策略的类。

建造者模式示例

为了理解建造者模式的实践应用,让我们考虑一个构建房子的示例。房子由地基、墙壁、屋顶和窗户等基本组件组成。

指挥者类

public class Director {
    private Builder builder;

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

    public void constructHouse() {
        builder.buildFoundation();
        builder.buildWalls();
        builder.buildRoof();
        builder.buildWindows();
    }
}

建造者接口

public interface Builder {
    void buildFoundation();
    void buildWalls();
    void buildRoof();
    void buildWindows();
}

具体建造者类

public class ConcreteBuilder implements Builder {
    private House house;

    public ConcreteBuilder() {
        this.house = new House();
    }

    @Override
    public void buildFoundation() {
        house.setFoundation("Concrete foundation");
    }

    @Override
    public void buildWalls() {
        house.setWalls("Brick walls");
    }

    @Override
    public void buildRoof() {
        house.setRoof("Tile roof");
    }

    @Override
    public void buildWindows() {
        house.setWindows("Wooden windows");
    }

    public House getHouse() {
        return house;
    }
}

使用建造者模式

public class Main {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.constructHouse();

        House house = builder.getHouse();
        System.out.println(house);
    }
}

在示例中,指挥者类负责控制房屋的构建过程,并将其组件委派给建造者对象。建造者对象根据指挥者的指导构建房屋,这种分离提高了房屋的维护性和可扩展性。

常见问题解答

  1. 建造者模式与工厂模式有何区别?
    工厂模式关注于创建对象本身,而建造者模式专注于对象的构建过程。

  2. 什么时候应该使用建造者模式?
    当需要创建复杂且可定制的对象时,或者当对象的构建过程需要与对象本身分开时,就应该使用建造者模式。

  3. 建造者模式有哪些缺点?
    建造者模式可能会引入额外的类和抽象层,从而增加代码的复杂性。

  4. 如何避免建造者模式中的代码冗余?
    可以使用继承和多态性来抽象重复的代码,或使用工厂方法模式来创建不同的建造者对象。

  5. 建造者模式的真实世界应用有哪些?
    建造者模式广泛应用于创建 GUI 组件、网络连接和数据库查询。