在类外使用构建器模式有什么好处?
内部课程:
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();
答案 0 :(得分:7)
取决于。
我经常将Builder
和Factory
模式结合起来,因此将Builder作为外部类是有意义的,因为“构建”对象可能是众多实现中的一种。这有一个额外的好处,即允许实现是包私有或甚至是Builder的私有内部类。
如果您正在使用Builder,只是让公共类的构造函数更具有意图,而不是真正的个人偏好。人们可以权衡在API中增加一个类的优缺点,这可能会让用户感到困惑。
但是,我建议选择其中一个选项,并在整个API中坚持使用它。如果所有构建器都是内部类或外部类,它使整个系统架构更容易理解;不要混淆它们。
不要像这样混合内部和外部构建器:
Foo foo = new Foo.Builder(...)
Bar bar = new BarBuilder(...)
答案 1 :(得分:1)
第二个实现确保您将获得一个完成的对象,从而使其更可靠的实现 而第一个是未说明的,直到你完成设置所有的字段。
一般来说,你不希望未说明的对象可供使用。