java - builder 模式会不会做得太多?

标签 java design-patterns class-design builder builder-pattern

我最近一直在和一个学习小组一起研究设计模式,并且逐渐了解到构建器模式对于创建由许多(可能是可选的)部分组成的复杂对象非常有用。

但是,构建器是否存在过分的情况?假设我们有一个包含许多不同对象组合的类,是否有另一种模式可能更适合它而不是制作几十个不同的构建器?是否可以通过不制作完全特定的构建器来减少所需构建器的数量?

我的学习小组和我不断回顾的例子是一家汽车制造商,比如在一家汽车公司的网站上。任何一家汽车公司都有几十辆汽车,每辆都有许多不同的特性、颜色、附加功能等。按照我的理解,您的构建器应该特定于您正在制作的确切对象,因此将构建器模式应用于此示例将产生数百个看起来像“RedSUVWithSunroofBuilder”、“BlueSUVWithSunroofBuilder”、“RedSUVBuilder”等的构建器。

使用构建器模式时,是否有任何原因导致我无法传递其中一些值来减少我需要创建的构建器数量?例如,与 RedSUVWithSunroofBuilder 或 BlueSUVWithSunroofBuilder 不同,做 SUVWithSunroofBuilder("Red") 和 SUVWithSunroofBuilder("Blue") 是否仍然适合构建器模式,还是更适合不同的模式?

最佳答案

builder 模式当然是自由裁量的,如果太复杂那就太复杂了,你可能要考虑另一种创建对象的方式,比如factory pattern .我认为构建器模式在某些情况下表现出色:

  • 创建具有多个有效配置的对象
    • 我认为你的汽车就是一个很好的例子
  • 在无法预先提供所有必需数据的情况下创建不可变对象(immutable对象)
    • 有关这方面的一个很好的例子,请查看 guava 不可变集合构建器,例如 ImmutableSet.Builder

这是一个如何实现汽车制造商的示例:

public class Car {
    private final boolean hasSunroof;
    private final Color color;
    private final int horsePower;
    private final String modelName;

    private Car(Color color, int horsePower, String modelName, boolean hasSunroof) {
        this.color = color;
        this.horsePower = horsePower;
        this.hasSunroof = hasSunroof;
        this.modelName = modelName;
    }

    public static Builder builder(Color color, int horsePower) {
        return new Builder(color, horsePower);
    }

    public static class Builder {
        private final Color color;
        private final int horsePower;
        private boolean hasSunroof;
        private String modelName = "unknown";

        public Builder(Color color, int horsePower) {
            this.color = color;
            this.horsePower = horsePower;
        }

        public Builder withSunroof() {
            hasSunroof = true;
            return this;
        }

        public Builder modelName(String modelName) {
            this.modelName = modelName;
            return this;
        }

        public Car createCar() {
            return new Car(color, horsePower, modelName, hasSunroof);
        }
    }
}

Builder 不必是嵌套类,但它确实允许您向可能滥用您的 API 的人隐藏您的构造函数。另请注意,即使创建构建器,也必须提供所需的最少参数。您可以像这样使用此构建器:

Car car = Car.builder(Color.WHITE, 500).withSunroof().modelName("Mustang").createCar();

关于java - builder 模式会不会做得太多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4737836/

相关文章:

java - Log4j:分包的不同日志级别

java - 如何使用 Ubuntu 11.04 +标题中的 Java Swing/SWT 菜单(如 Mac OS 中)?

java - java中的文件处理

c# - 如何封装额外的字段?

c++ - 为可能改变其内部属性的类选择设计模式

ios - 创建一个 objective-c 全局类

c++ - 很多相互依赖的状态如何使用设计模式?

java - GSON & Volley => 预期为 BEGIN_ARRAY 但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT

java - 构建器模式是否适用此要求?

java - 声明类属性 protected 还是公开?