评论
return Google.Developer.DevBuilder("John", "Doe").age(30).build();
这毫无意义。仔细看看,上面的调用会导致一个类Google,它包含一个内部类Developer。该类定义了一个名为DevBuilder 的静态方法,它接受两个参数,名字和姓氏,并返回Builder/DeveloperBuilder 的实例。
这不是面向对象的可扩展方法。尽管您给我们的背景很少,但我认为公司是静态对象,不会发生变化。参考您在 cmets 中所做的示例 - 新公司比新 CompressFormat 更有可能。
此外,除了对age(int) 和build() 的动态调用之外,不可能通过多态来改变行为。
动态方法
下面是一种更动态的方法的概念(当然应该添加机制,以确保公司只有一个对象,例如Company.byName("Google") 等)
public static void main(String[] args) {
Company google = new Google();
Manager manager = google.newManager();
}
static abstract class Company {
public Manager newManager() {
return new ManagerBuilder("Eve", "Page").age(40).build();
}
}
static class Google extends Company {
}
您可以轻松添加新公司并更改经理(或任何其他员工)的创建方式,您也可以使用默认值。
重构
再玩一些,您可以通过创建两个基类如下来删除员工及其相应构建器的类中的样板代码
static abstract class Person<P extends Person<P>> {
protected final String firstName;
protected final String lastName;
protected final int age;
public <T extends AbstractBuilder<P, T>> Person(AbstractBuilder<P, T> builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
}
}
static abstract class AbstractBuilder<P extends Person, T extends AbstractBuilder<P, T>> {
protected final String firstName;
protected final String lastName;
protected int age;
public AbstractBuilder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
abstract T self();
abstract P build();
T age(int age) {
this.age = age;
return self();
}
}
利用上述方法,创建一个类Manager 及其Builder 产生以下代码
static class Manager extends Person<Manager> {
public <T extends AbstractBuilder<Manager, T>> Manager(AbstractBuilder<Manager, T> builder) {
super(builder);
}
}
static class ManagerBuilder extends AbstractBuilder<Manager, ManagerBuilder> {
public ManagerBuilder(String firstName, String lastName) {
super(firstName, lastName);
}
@Override
ManagerBuilder self() {
return this;
}
@Override
Manager build() {
return new Manager(this);
}
}
Manager及其Builder,或任何其他员工都可以扩展更多字段。