Java builder design pattern

Java builder design pattern comes under the Creational Design Pattern category and it is used to build complex object from simple objects using step-by-step approach.

Main advantage of builder design pattern is that it provides better control over object construction process.

Let’s, consider the example of fast-food restaurant. A burger and a cold drink could be a meal type there. A burger can be Veg Burger or NonVeg Burger packed by a wrapper. Cold drink can be like Pespsi or Limca packed in a bottle.

Example

Item.java

package com.w3schools;
 
public interface Item {
   public String name();
   public float price();
   public Packing packing();
}

Packing.java

package com.w3schools;
 
public interface Packing {
	public String pack();
}

Wrapper.java

package com.w3schools;
 
public class Wrapper implements Packing {
   @Override
   public String pack() {
      return "Wrapper";
   }
}

Bottle.java

package com.w3schools;
 
public class Bottle implements Packing {
   @Override
   public String pack() {
      return "Bottle";
   }
}

Burger.java

package com.w3schools;
 
public abstract class Burger implements Item {
   @Override
   public Packing packing() {
      return new Wrapper();
   }
 
   @Override
   public abstract float price();
}

ColdDrink.java

package com.w3schools;
 
public abstract class ColdDrink implements Item {
   @Override
   public Packing packing() {
      return new Bottle();
   }
 
   @Override
   public abstract float price();
}

VegBurger.java

package com.w3schools;
 
public class VegBurger extends Burger {
   @Override
   public float price() {
      return 50.0f;
   }
 
   @Override
   public String name() {
      return "Veg Burger";
   }
}

NonVegBurger.java

package com.w3schools;
 
public class NonVegBurger extends Burger {
   @Override
   public float price() {
      return 100.0f;
   }
 
   @Override
   public String name() {
      return "NonVeg Burger";
   }
}

Pepsi.java

package com.w3schools;
 
public class Pepsi extends ColdDrink {
   @Override
   public float price() {
      return 35.0f;
   }
 
   @Override
   public String name() {
      return "Cold Drink Pepsi";
   }
}

Limca.java

package com.w3schools;
 
public class Limca extends ColdDrink {
   @Override
   public float price() {
      return 35.0f;
   }
 
   @Override
   public String name() {
      return "Cold Drink Limca";
   }
}

Meal.java

package com.w3schools;
 
import java.util.ArrayList;
import java.util.List;
 
public class Meal {
   private List<Item> items = new ArrayList<Item>();	
 
   public void addItem(Item item){
      items.add(item);
   }
 
   public float getCost(){
      float cost = 0.0f;
 
      for (Item item : items) {
         cost += item.price();
      }		
      return cost;
   }
 
   public void displayItems(){	   
      for (Item item : items) {
         System.out.print("Item : " + item.name());
         System.out.print(", Packing : " + item.packing().pack());
         System.out.println(", Price : " + item.price());
      }		
   }
}

MealBuilder.java

package com.w3schools;
 
public class MealBuilder {
  public Meal buildVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new VegBurger());
      meal.addItem(new Pepsi());
      return meal;
   }   
 
   public Meal buildNonVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new NonVegBurger());
      meal.addItem(new Limca());
      return meal;
   }
}

Item.java

package com.w3schools;
 
public class BuilderPatternTest {
  public static void main(String args[]){
      MealBuilder mealBuilder = new MealBuilder();
 
      Meal vegMeal = mealBuilder.buildVegMeal();
      System.out.println("Veg Meal");
      vegMeal.displayItems();
      System.out.println("Total Cost: " + vegMeal.getCost());
 
      Meal nonVegMeal = mealBuilder.buildNonVegMeal();
      System.out.println("NonVeg Meal");
      nonVegMeal.displayItems();
      System.out.println("Total Cost: " + nonVegMeal.getCost());
  }
}

Output

Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 50.0
Item : Cold Drink Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.0
NonVeg Meal
Item : NonVeg Burger, Packing : Wrapper, Price : 100.0
Item : Cold Drink Limca, Packing : Bottle, Price : 35.0
Total Cost: 135.0