Builder Pattern
/* ADVANTAGES:
* 1) Immutable Object
* 2) Readability
* 3) No need of Multiple argument method
* 4) Can put proper validation on values while assigning values
* 5) Can force to have mandatory values while building object
* 6) No need of multiple argument constructor
* 7) Increase/decrease some required values based on value assignments
* */
package pattern.builder;
public class FoodDish {
private String rice;
private String daal;
private String salad;
private String sabji;
private String roti;
public static class DishBuilder {
String rice;
String daal;
String salad;
String sabji;
String roti;
public DishBuilder withRice(String thatRice) {
rice = thatRice;
return this;
}
public DishBuilder withDaal(String thatDaal) {
daal = thatDaal;
return this;
}
public DishBuilder withSalad(String thatSalad) {
salad = thatSalad;
return this;
}
public DishBuilder withSabji(String thatSabji) {
sabji = thatSabji;
return this;
}
public DishBuilder withRoti(String thatRoti) {
roti = thatRoti;
return this;
}
public FoodDish build() {
return new FoodDish(this);
}
}
public FoodDish(DishBuilder dishBuilder) {
rice = dishBuilder.rice;
daal = dishBuilder.daal;
salad = dishBuilder.salad;
roti = dishBuilder.roti;
sabji = dishBuilder.sabji;
}
public String toString() {
return "FoodDish [rice=" + rice + ", daal=" + daal + ", salad=" + salad + ", sabji=" + sabji + ", roti=" + roti
+ "]";
}
}
public class FoodDishFlight {
public static void main(String[] dataBag) {
FoodDish foodDish = new FoodDish.DishBuilder()
.withRice("Basmati")
.withDaal("GujaratiDaal")
.withSabji("Paneer")
.withRoti("ButterRoti")
.withSalad("MixSalad")
.build();
System.out.println(foodDish);
}
}