Ho avuto una domanda riguardante il "Builder Pattern" coperto da "Effective Java". Abbiamo bisogno di un metodo .build()
per implementare correttamente il pattern? Per esempio, diciamo che abbiamo la seguente classe:Abbiamo bisogno di un metodo .build() nel Pattern Builder?
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;
}
}
E allora come lo usiamo:
CoffeeDrink c = CoffeeDrink.buildNewDrink()
.withEspresso(2)
.withMilkType(2)
.withWhip();
Sarebbe questo essere ancora valida se non ho una statica interna Builder
classe? Immagino che uno dei vantaggi sia che si tratti di creare un nuovo oggetto CoffeeDrink
finché non viene chiamato il metodo .build()
, ma sto ancora creando un oggetto Builder
. Sto solo cercando alcuni chiarimenti.
Il builder viene vantaggiosamente utilizzata con le classi immutabili. Con loro, il Builder è una classe "helper" mutabile che aiuta nella costruzione definitiva del prodotto finale che è quindi immutabile. Il tuo esempio è semplicemente un semplice POJO e condivide gli svantaggi di JavaBeans (modificabile, può essere visualizzato in uno stato incompleto o incoerente, ecc.). – scottb