【发布时间】: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