【问题标题】:Builder Pattern inside vs outside class?课堂内外的建造者模式?
【发布时间】:2013-10-02 06:06:00
【问题描述】:

在类内与类外使用构建器模式有什么优势?

课内:

public class Person {
    private String name;
    private String eyeColor;
    private String hairColor;

    public Person setName(String name) {
        this.name = name;
        return this;
    }

    public Person setEyeColor(String eyeColor) {
        this.eyeColor = eyeColor;
        return this;
    }

    public Person setHairColor(String hairColor) {
        this.hairColor = hairColor;
        return this;
    }
} 

// Example usage:
Person p = new Person()
                 .setName("Bob")
                 .setHairColor("Black")
                 .setEyeColor("Brown")

课外:

public class Person {
    private String name;
    private String eyeColor;
    private String hairColor;

    public Person(String name, String eyeColor, String hairColor) {
        this.name = name;
        this.eyeColor = eyeColor;
        this.hairColor = hairColor; 
    }  
} 

public class PersonBuilder {
    private String name;
    private String eyeColor;
    private String hairColor;

    public Person build() {
        return new Person(name, eyeColor, hairColor);
    }

    public PersonBuilder with(String name) {
        this.name = name;
        return this;
    }

    public PersonBuilder setEyeColor(String eyeColor) {
        this.eyeColor = eyeColor;
        return this;
    }

    public PersonBuilder setHairColor(String hairColor) {
        this.hairColor = hairColor;
        return this;
    }
} 

// Example usage:
Person p = new PersonBuilder()
                 .setName("Bob")
                 .setHairColor("Black")
                 .setEyeColor("Brown")
                 .build();

【问题讨论】:

  • 这是基于意见的......但我认为把它放在里面可以降低混乱。您可以拥有 MyClass.Builder、MyClass2.Builder 等 - 而不是一大堆 MyClassBuilder、MyClass2Builder 等
  • 对于简单的事情并不重要,但是您可能希望将 setter 返回类型用于其他一些指示(在复杂的 setter 中),在这种情况下,外部的会提供更大的灵活性。我个人会选择外部的。
  • 恕我直言,Builder 应该是一个内部类,因为它打算由正在构建的类专门使用。正因为如此,让它成为一个常规课程并没有真正的好处。
  • 当您无法访问要构建的类的源时,使用外部构建器有一个用例。例如外部 jar 中的 DTO。

标签: java design-patterns builder


【解决方案1】:

视情况而定。

我经常将 Builder 和 Factory 模式结合起来,因此将 Builder 作为外部类是有意义的,因为“构建”对象可能是许多实现之一。这还有一个额外的好处,就是允许实现封装私有,甚至是 Builder 的私有内部类。

如果您使用 Builder 只是为了使公共类的构造函数更显意图或不那么混乱,而不是真正的个人喜好。人们可以权衡在 API 中增加一个类的利弊,这可能会使用户感到困惑。

但是,我建议选择其中一个选项并在整个 API 中坚持使用它。如果所有 Builder 都是内部类或外部类,它会使整个系统架构更容易理解;不要混合它们。

不要像这样混合内部和外部构建器:

Foo foo = new Foo.Builder(...)

Bar bar = new BarBuilder(...)

【讨论】:

    【解决方案2】:

    第二个实现向您保证您将获得一个完成的对象,从而使其实现更可靠 而第一个是未说明的,直到你完成所有字段的设置。

    一般来说,您不希望未说明的对象可供使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多