建造者模式


建造者模式

建造者模式是一种创建型设计模式。它允许你分步骤创建复杂对象,将对象的构造过程与其表现进行解耦,从而使得同样的构建过程可以产生不同的表现形式。

使用场景

在以下情况下应该使用建造者模式:

  • 当你需要创建复杂对象,并且该对象需要通过多个组件进行初始化。
  • 当你希望通过改变对象构造过程的顺序,或者动态更换组件,来生成不同的对象表现形式。

组成部分

建造者模式主要包含以下组成部分:

  • Builder:为创建产品对象的各个部件指定抽象接口。
  • Concrete Builder:实现Builder接口,并构造表示产品的对象。
  • Product:表示被构造的复杂对象。它通常包含多个部件。
  • Director:构建一个使用Builder接口的对象。

优缺点

优点:

  • 构造代码与表示代码分离,由于Builder隐藏了该产品是如何组装的,所以产品内部可以变化而不影响使用它的代码。
  • 强制实施了一种分步骤构建过程,这让我们能够更好地控制该对象的构建。
  • 允许您生成不同表现形式的对象,而在不同表现形式之间共享相同的构造代码。

缺点:

  • 由于建造者模式需要创建许多小型的类,因此会增加系统的复杂性和理解难度。

示例代码

public class Car {
    private String engine;
    private String wheels;
    private String body;

    public String getEngine() {
        return engine;
    }

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

    public String getWheels() {
        return wheels;
    }

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

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }
}

public interface CarBuilder {
    public void buildEngine();
    public void buildWheels();
    public void buildBody();
    public Car getCar();
}

public class SportsCarBuilder implements CarBuilder {
    private Car car;

    public SportsCarBuilder() {
        car = new Car();
    }

    public void buildEngine() {
        car.setEngine("V8");
    }

    public void buildWheels() {
        car.setWheels("18");
    }

    public void buildBody() {
        car.setBody("Carbon Fiber");
    }

    public Car getCar() {
        return car;
    }
}

public class CarDirector {
    private CarBuilder builder;

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

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

以上代码演示了如何使用建造者模式创建汽车对象。在这个示例中,Car是要构建的复杂对象,而SportsCarBuilder是针对SportsCar的具体生成器的实现。CarDirector是导演类,它维护Builder接口,并负责构建一个使用这个接口的对象。通过使用Builder接口,我们可以将复杂对象的创建过程分解为多个简单的步骤。在这些步骤中,我们可以动态更换组件,并且使用相同的步骤来构建完全不同的对象。