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);
    }
}