java - 没有输入参数的构建器,具有静态构建方法?

标签 java design-patterns coding-style builder

我知道并且经常使用经典的“Builder”设计模式,其中描述了 here 。 然而,我现在有一种情况,我想使用类似构建器模式的东西,但在这种特殊情况下,我不必在“构建器”中设置任何参数,因为“构建器”使用的所有值都是常量,不必动态设置。 我现在将我的“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();

在这种情况下,“构建器”可以包含以下代码(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 的内容,但我得出的结论是我的案例不是工厂方法模式,因为它没有使用多态性。参见前述文章第一句:

"In class-based programming, the factory method pattern is a creational pattern which uses factory methods to deal with the problem of creating objects without specifying the exact class of object that will be created."

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

"The factory method pattern should not be confused with the more general notion of factories and factory methods. The factory method pattern is the best-known use of factories and factory methods, but not all uses of factory methods are examples of the factory method pattern – only when inheritance is involved (a class implementing an interface, or derived class, implements a factory method) is it an example of the factory method pattern. More basic uses of factories are not examples of the factory method pattern, and may instead be referred to as the factory pattern or a simple factory; these are discussed at factory."

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

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

最佳答案

这不是builder我不认为它只是一个工厂方法,即生产固定对象的方法。

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

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

关于java - 没有输入参数的构建器,具有静态构建方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26118790/

相关文章:

java - Java中的匿名内部类

java - Spring @Value 将空字符串拆分为列表

java定时器倒计时jtable

java - 如何在两个线程之间共享变量

android - 如何自定义安卓锁屏?

java - 为什么 String 将 null 与 + 运算符连接起来并使用 concate() 方法抛出 NullPointerException

mysql - 在 MySQL 中如何使用继承?

c# - 存储库模式 : Implementation and lazy loading of model relationships

java - 这个 hacky 枚举可以改进吗?

php - 使用 Doctrine EntityRepository 中的魔术查找方法好吗?