7

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

课内:

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();
4

2 回答 2

9

这取决于。

我经常组合BuilderFactory模式,因此将 Builder 作为外部类是有意义的,因为“构建”对象可能是许多实现之一。这有一个额外的好处,即允许实现是包私有的,甚至是 Builder 的私有内部类。

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

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

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

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

Bar bar = new BarBuilder(...)
于 2013-10-02T20:27:32.787 回答
2

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

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

于 2013-12-25T09:11:08.900 回答