可以使用静态内部类的方式来解决Builder模式受保护构造函数的问题。
示例代码:
public class Coffee {
private final String type;
private final String size;
private final int sugar;
private final boolean milk;
private Coffee(Builder builder) {
this.type = builder.type;
this.size = builder.size;
this.sugar = builder.sugar;
this.milk = builder.milk;
}
public String getType() {
return type;
}
public String getSize() {
return size;
}
public int getSugar() {
return sugar;
}
public boolean hasMilk() {
return milk;
}
public static class Builder {
private final String type;
private final String size;
private int sugar = 0;
private boolean milk = false;
public Builder(String type, String size) {
this.type = type;
this.size = size;
}
public Builder addSugar(int sugar) {
this.sugar = sugar;
return this;
}
public Builder addMilk(boolean milk) {
this.milk = milk;
return this;
}
public Coffee build() {
return new Coffee(this);
}
}
}
这里我们定义一个外部的Coffee类和一个内部的Builder类,Coffee类的构造函数为私有的,通过Builder构建Coffee实例,Builder类的构造函数为公开的,用户可以通过Builder构建Coffee实例,但是不能直接new一个Coffee实例,保证Coffee实例的不可变性。