没有输入参数的Builder,有静态构建方法吗?

时间:2014-09-30 10:43:30

标签: java design-patterns coding-style builder

我知道并且经常使用经典的“构建器”设计模式,其中描述了here。 但是,我现在有一个案例,我想使用类似Builder的模式,但在这种特殊情况下,我不必在我的“Builder”中设置任何参数,因为“Builder”使用的所有值都是是常量,不必动态设置。 我现在将“Builder”实现为经典的Builder,就像这样(代码简化了):

final class MyBuilder {

    private static final String FOO = "foo";
    private static final String BAR = "bar";

    private List<MyResult> results = new ArrayList<>();


    MyBuilder() {
        // empty constructor
    }

    List<MyResult> build() {
        results.add(createFoo());
        results.add(createBar());

        return results;
    }

    private MyResult createFoo() {
        ...
    }    

    private MyResult createBar() {
        ...
    }    

    ...

}

此构建器的使用方式如下:

MyBuilder resultsBuilder = new MyBuilder();
List<MyResult> results = resultsBuilder.build();

或者可以像这样使用:

List<MyResult> results = new MyBuilder().build();

由于与经典构建器不同,这个特定的“构建器”不期望任何输入参数(不需要调用构建器的setter),它可以提供一个静态方法,它将创建它的实例和返回最终结果,以便可以像这样使用构建器:

List<MyResult> results = MyBuilder.build();

在这种情况下,“builder”可能包含以下代码(build()方法是静态的):

final class MyBuilder {

    private static final String FOO = "foo";
    private static final String BAR = "bar";

    private List<MyResult> results = new ArrayList<>();


    private MyBuilder() {
        // hidden constructor
    }

    static List<MyResult> build() {
        MyBuilder builder = new MyBuilder();
        return builder.build();
    }

    private List<MyResult> buildResults() {
        results.add(createFoo());
        results.add(createBar());

        return results;
    }

    private MyResult createFoo() {
        ...
    }    

    private MyResult createBar() {
        ...
    }    

    ...

}

它还是生成器吗?在您看来,对Builder模式的这种修改是否正常? 是否存在可能更适合这种特殊情况的不同设计模式?

我读过关于factory method pattern的内容,但我得出的结论是我的案例不是工厂方法模式,因为它不使用多态。见上述文章的第一句:

  

“在基于类的编程中,工厂方法模式是一个   创建模式,使用工厂方法来处理问题   创建对象而不指定确切的对象类   将被创建。“

我指定将由静态方法创建的对象的确切类。另见上述文章中的定义章节:

  

“工厂方法模式不应与更多混淆   工厂和工厂方法的一般概念。工厂方法   模式是最着名的工厂和工厂方法的使用,但   并非所有工厂方法的使用都是工厂方法的例子   模式 - 仅在涉及继承时(实现一个类的类)   接口,或派生类,实现工厂方法)是它   工厂方法模式的示例。工厂的更基本用途   不是工厂方法模式的示例,而是可以是   简称工厂模式或简单工厂;这些是   在factory讨论过。“

所以也许这是一个简单的工厂(不要与factory method pattern混淆)?你怎么看待这件事?

如何调用“MyBuilder”类(其中“My”是业务特定名称的占位符)?也许MyFactory?

1 个答案:

答案 0 :(得分:1)

它不是builder我不认为它只是一种工厂方法,即生产固定物体的方法。

构建器允许您在构建对象之前指定要构建的对象的选项,以便可以更改构建的实例。工厂方法在调用时只生成对象的实例,并且通常是静态的。

您可以考虑一种方法,其中构建器类使用静态方法返回默认构建器实例,该实例具有许多预先配置的选项,然后您可以进一步修改这些选项。但是如果你总是想要返回相同的对象,那么你的工厂方法就可以了。