编程语言
首页 > 编程语言> > java – 构建器模式可能做得太多了吗?

java – 构建器模式可能做得太多了吗?

作者:互联网

我最近一直在与一个研究小组一起研究设计模式,并且已经认识到构建器模式对于创建由许多(可能是可选的)部分组成的复杂对象非常有用.

但是,建造者做得太多了吗?假设我们有一个具有许多不同对象组合的类,是否有另一种模式可能更适合它而不是制作数十种不同的构建器?是否可以通过不制作完全特定的构建器来减少所需的构建器数量?

我的研究小组和我不断回来的例子是汽车制造商,例如在汽车公司的网站上.任何汽车公司都有几十辆汽车,每辆汽车都有许多不同的功能,颜色,附加功能等.我理解它的方式,你的构建器应该特定于你正在制作的对象,所以在这个例子中应用构建器模式将产生数百个看起来像“RedSUVWithSunroofBuilder”,“BlueSUVWithSunroofBuilder”,“RedSUVBuilder”等的构建器.

是否有任何理由使用构建器模式,我无法传递其中一些值以减少我需要创建的构建器数量?例如,不是使用RedSUVWithSunroofBuilder或BlueSUVWithSunroofBuilder,它仍然适合构建模式来执行SUVWithSunroofBuilder(“Red”)和SUVWithSunroofBuilder(“Blue”),还是更适合不同的模式?

解决方法:

构建器模式当然是自由裁量的,如果它过于复杂则过于复杂,你可能想要考虑一种不同的方式来创建对象,比如factory pattern.我认为有一些场景,构建器模式擅长:

>创建具有多个有效配置的对象

>我认为你的汽车用品就是一个很好的例子

>创建不可变的对象,而不是可以预先提供所有必需的数据

>有关这方面的一个很好的例子,请查看番石榴不可变集合构建器,例如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,design-patterns,class-design,builder,builder-pattern
来源: https://codeday.me/bug/20190714/1456555.html