vic*_*jia 8 java design-patterns builder effective-java
我有一个关于"Effective Java"中涵盖的"Builder Pattern"的问题.我们需要一种.build()方法来正确实现模式吗?例如,假设我们有以下类:
public class CoffeeDrink {
private int numEspressoShots;
private short milkType;
private boolean withWhip;
private CoffeeDrink() {
}
public static CoffeeDrink buildNewDrink() {
return new CoffeeDrink();
}
public CoffeeDrink withEspresso(int n) {
this.numEspressoShots = n;
return this;
}
public CoffeeDrink withMilkType(shot t) {
this.milkType = t;
return this;
}
public CoffeeDrink withWhip() {
this.withWhip = true;
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们如何使用它:
CoffeeDrink c = CoffeeDrink.buildNewDrink()
.withEspresso(2)
.withMilkType(2)
.withWhip();
Run Code Online (Sandbox Code Playgroud)
如果我没有静态内部Builder类,这仍然有效吗?我猜其中一个优点是,CoffeeDrink在.build()调用该方法之前,它不会创建新对象,但我仍在创建一个Builder对象.只是寻求一些澄清.
rge*_*man 17
不,这不是Builder模式.它是有效的Java,它将编译并运行.但是你的buildNewDrink()方法,无论是被调用build()还是buildNewDrink()其他东西,只是一个简单的工厂方法,可以创建一个CoffeeDrink.那些其他方法就像setter方法碰巧返回自己.
该static嵌套类生成器是必要的.在不创建类实例的同时,它可以执行验证逻辑以确保不会创建无效对象.我不确定CoffeeDrink你的状态是否存在无效状态,但如果确实如此,那么使用你的代码,可能会创建一个CoffeeDrink并在创建之后将其置于无效状态,但在其他方法之前被称为.Builder模式通过在构建实例之前验证数据来消除这种可能性.它还消除了构造函数爆炸的需要,其中需要许多具有所有可能的参数组合的构造函数,以涵盖所有可能的情况.
| 归档时间: |
|
| 查看次数: |
8838 次 |
| 最近记录: |