java我们需要一个。生成器模式中的build()方法?
我有一个关于“有效Java”中的“构建器模式”的问题。我们需要一个.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;
}
}
然后我们如何使用它:
CoffeeDrink c = CoffeeDrink.buildNewDrink()
.withEspresso(2)
.withMilkType(2)
.withWhip();
如果我没有静态的内部Builder
类,这仍然有效吗?我猜其中一个优点是,在调用方法.build()
之前,它不会创建一个新的CoffeeDrink
对象,但我仍然在创建一个Builder
对象。只是想澄清一下
# 1 楼答案
不,这不是生成器模式。它是有效的Java,它将编译并运行。但是你的
buildNewDrink()
方法,不管它被称为build()
或buildNewDrink()
或其他什么,只是一个简单的工厂方法,它创建了一个CoffeeDrink
。其他方法就像setter方法一样,它们恰好返回自己static
嵌套的构建器类是必需的。在推迟创建类实例时,它可以执行验证逻辑,以确保不创建无效对象。我不确定CoffeeDrink
是否存在无效状态,但如果它存在,使用您的代码,就有可能创建一个CoffeeDrink
,并在创建之后,但在调用其他方法之前,使其处于无效状态。构建器模式通过在构建实例之前验证数据来消除这种可能性。它还消除了构造函数爆炸的需要,在这种情况下,需要大量具有所有可能参数组合的构造函数来覆盖所有可能的情况