Builder Design Pattern

Builder Pattern says that “construct a complex object from simple objects using step-by-step approach”

It is mostly used when object can’t be created in single step like in the de-serialization of a complex object.

Advantage of Builder Design Pattern

The main advantages of Builder Pattern are as follows:

  • It provides clear separation between the construction and representation of an object.
  • It provides better control over construction process.
  • It supports to change the internal representation of objects.

UML for Builder Pattern Example

Builder Design Pattern


Example of Builder Design Pattern

To create simple example of builder design pattern, you need to follow 6 following steps.

  1. Create Packing interface
  2. Create 2 abstract classes CD and Company
  3. Create 2 implementation classes of Company: Sony and Samsung
  4. Create the CDType class
  5. Create the CDBuilder class
  6. Create the BuilderDemo class.

public interface Packing {

public String pack();

public int price();

}

2)Create 2 abstract classes CD and Company Create an

abstract class CD

which will

implement Packing interface.

File:CD.java

public abstract class CD implements Packing {

public abstract String pack();

}

File:Company.java

public abstract class Company extends CD {

public abstract int price();

}

3)Create 2

implementation classes of Company: Sony and Samsung File:Sony.java

public class Sony extends Company {

@Override

public int price() {

return 20;

}

@Override

public String pack() {

return “Sony CD”;

}

}// End of the Sony class.

File:Samsung.java

public class Samsung extends Company {

@Override

public int price() {

return 15;

}

@Override

public String pack() {

return “Samsung CD”;

}

}// End of the Samsung class.

4)

Create the CDType

class File:CDType.

java

import java.util.ArrayList;

import java.util.List;

public class CDType {

private List<Packing> items = new ArrayList<Packing>();

publicvoidaddItem(Packing packs) {

items.add(packs);

}

publicvoidgetCost() {

for (Packing packs : items) {

packs.price();

}

}

publicvoidshowItems() {

for (Packing packing : items) {

System.out.print(“CD name : ” + packing.pack());

System.out.println(“, Price : ” + packing.price());

}

}}// End of the CDType class.

5)

Create the CDBuilder

class File:CDBuilder.java

publicclassCDBuilder {

public CDType buildSonyCD() {

CDType cds = new CDType();

cds.addItem(new Sony());

returncds;

}

public CDType buildSamsungCD() {

CDType cds = new CDType();

cds.addItem(new Samsung());

returncds;

}

}// End of the CDBuilder class.

6)

Create the BuilderDemo

class File:BuilderDemo.java

public class BuilderDemo{  

 public static void main(String args[]){  

   CDBuilder cdBuilder=new CDBuilder();  

   CDType cdType1=cdBuilder.buildSonyCD();  

   cdType1.showItems();  

  

   CDType cdType2=cdBuilder.buildSamsungCD();  

   cdType2.showItems();  

 }  

}

Another Real world example of Builder Pattern

UML for Builder Pattern:

We are considering a business case of pizza-hut where we can get different varieties of pizza and cold-drink.

Pizza can be either a Veg pizza or Non-Veg pizza of several types (like cheese pizza, onion pizza, masala-pizza etc) and will be of 4 sizes i.e. small, medium, large, extra-large.

Cold-drink can be of several types (like Pepsi, Coke, Dew, Sprite, Fanta, Maaza, Limca, Thums-up etc.) and will be of 3 sizes small, medium, large.

Builder Design Pattern uml

Real world example of builder pattern

Let’s see the step by step real world example of Builder Design Pattern.

Step 1:Create an interface Item that represents the Pizza and Cold-drink.

File: Item.java

public interface Item {

publicString name();

publicString size();

publicfloatprice();

}// End of the interface Item.

Step 2:Create an abstract class Pizza that will implement to the interface Item.

File: Pizza.java

public abstract class Pizza implements Item {

@Override

publicabstractfloatprice();

}

Step 3:Create an abstract class ColdDrink that will implement to the interface Item.

File: ColdDrink.java

public abstract class ColdDrink implements Item {

@Override

publicabstractfloatprice();

}

Step 4:Create an abstract class VegPizza that will extend to the abstract class Pizza.

public abstract class VegPizza extends Pizza {

@Override

publicabstractfloatprice();

@Override

publicabstractString name();

@Override

publicabstractString size();

}// End of the abstract class VegPizza.

Step 5:Create an abstract class NonVegPizza that will extend to the abstract class Pizza.

public abstract class NonVegPizza extends Pizza {

@Override

publicabstractfloatprice();

@Override

publicabstractString name();

@Override

publicabstractString size();

}// End of the abstract class NonVegPizza.

Step 6:Now, create concrete sub-classes SmallCheezePizza, MediumCheezePizza, LargeCheezePizza, ExtraLargeCheezePizza that will extend to the abstract class VegPizza.

public class SmallCheezePizza extends VegPizza {

@Override

publicfloatprice() {

return170.0f;

}

@Override

publicString name() {

return “Cheeze Pizza”;

}

@Override

publicString size() {

return “Small size”;

}

}// End of the SmallCheezePizza class.

public class MediumCheezePizza extends VegPizza {

@Override

publicfloatprice() {

return220.f;

}

@Override

publicString name() {

return “Cheeze Pizza”;

}

@Override

publicString size() {

return “Medium Size”;

}

}// End of the MediumCheezePizza class.

public class LargeCheezePizza extends VegPizza {

@Override

publicfloatprice() {

return260.0f;

}

@Override

publicString name() {

return “Cheeze Pizza”;

}

@Override

publicString size() {

return “Large Size”;

}

}// End of the LargeCheezePizza class.

public class ExtraLargeCheezePizza extends VegPizza {

@Override

publicfloatprice() {

return300.f;

}

@Override

publicString name() {

return “Cheeze Pizza”;

}

@Override

publicString size() {

return “Extra-Large Size”;

}

}// End of the ExtraLargeCheezePizza class.

Step 7:Now, similarly create concrete sub-classes SmallOnionPizza, MediumOnionPizza, LargeOnionPizza, ExtraLargeOnionPizza that will extend to the abstract class VegPizza.

public class SmallOnionPizza extends VegPizza {

@Override

publicfloatprice() {

return120.0f;

}

@Override

publicString name() {

return “Onion Pizza”;

}

@Override

publicString size() {

return “Small Size”;

}

}// End of the SmallOnionPizza class.

public class MediumOnionPizza extends VegPizza {

@Override

publicfloatprice() {

return150.0f;

}

@Override

publicString name() {

return “Onion Pizza”;

}

@Override

publicString size() {

return “Medium Size”;

}

}// End of the MediumOnionPizza class.

public class LargeOnionPizza extends  VegPizza{  

    @Override  

    public float price() {  

        return 180.0f;  

    }  

    @Override  

    public String name() {  

         return “Onion Pizza”;  

    }  

    @Override  

    public String size() {  

       return  “Large size”;  

    }  

}// End of the LargeOnionPizza class.

File:ExtraLargeOnionPizza.java

public class ExtraLargeOnionPizza extends VegPizza {  

    @Override  

    public float price() {  

        return 200.0f;  

    }  

    @Override  

    public String name() {  

         return  “Onion Pizza”;  

    }  

    @Override  

    public String size() {  

       return  “Extra-Large Size”;  

    }  

}// End of the ExtraLargeOnionPizza class

Step 8:Now, similarly create concrete sub-classes SmallMasalaPizza, MediumMasalaPizza, LargeMasalaPizza, ExtraLargeMasalaPizza that will extend to the abstract class VegPizza.

public class SmallMasalaPizza extends VegPizza{  

    @Override  

    public float price() {  

        return 100.0f;  

    }  

    @Override  

    public String name() {  

        return  “Masala Pizza”;  

    }  

    @Override  

    public String size() {  

       return  “Samll Size”;  

    }  

}// End of the SmallMasalaPizza class

File:MediumMasalaPizza.java

public class MediumMasalaPizza extends VegPizza {

@Override

publicfloatprice() {

return120.0f;

}

@Override

publicString name() {

return “Masala Pizza”;

}

@Override

publicString size() {

return “Medium Size”;

}File:LargeMasalaPizza.java

public class LargeMasalaPizza extends VegPizza {

@Override

publicfloatprice() {

return150.0f;

}

@Override

publicString name() {

return “Masala Pizza”;

}

@Override

publicString size() {

return “Large Size”;

}

} // End of the LargeMasalaPizza class

File:ExtraLargeMasalaPizza.java

public class ExtraLargeMasalaPizza extends VegPizza {  

    @Override  

    public float price() {  

        return 180.0f;  

    }  

  

    @Override  

    public String name() {  

      

        return  “Masala Pizza”;  

      

    }  

  

    @Override  

    public String size() {  

       return  “Extra-Large Size”;  

    }  

}

// End of the ExtraLargeMasalaPizza class

Step 9:Now, create concrete sub-classes SmallNonVegPizza, MediumNonVegPizza, LargeNonVegPizza, ExtraLargeNonVegPizza that will extend to the abstract class NonVegPizza.

public class SmallNonVegPizza extends NonVegPizza {  

  

    @Override  

    public float price() {  

        return 180.0f;  

    }  

  

    @Override  

    public String name() {  

       return “Non-Veg Pizza”;  

    }  

  

    @Override  

    public String size() {  

        return “Samll Size”;  

    }  

      

}// End of the SmallNonVegPizza class

File:MediumNonVegPizza.java

public class MediumNonVegPizza extends NonVegPizza {

@Override

publicfloatprice() {

return200.0f;

}

@Override

publicString name() {

return “Non-Veg Pizza”;

}

@Override

publicString size() {

return “Medium Size”;

}File:LargeNonVegPizza.java

public class LargeNonVegPizza extends NonVegPizza {

@Override

publicfloatprice() {

return220.0f;

}

@Override

publicString name() {

return “Non-Veg Pizza”;

}

@Override

publicString size() {

return “Large Size”;

}

}// End of the LargeNonVegPizza class

File:ExtraLargeNonVegPizza.java

public class ExtraLargeNonVegPizza extends NonVegPizza {  

    @Override  

    public float price() {  

        return 250.0f;  

    }  

  

    @Override  

    public String name() {  

       return “Non-Veg Pizza”;  

    }  

  

    @Override  

    public String size() {  

        return “Extra-Large Size”;  

    }  

      

}

Step 10:Now, create two abstract classes Pepsi and Coke that will extend abstract class ColdDrink.

public abstract class Pepsi extends ColdDrink {  

  

    @Override  

    public abstract  String name();  

  

    @Override  

    public abstract  String size();  

      

    @Override  

    public abstract  float price();   

      

}// End of the Pepsi class

File:Coke.java

public abstract class Coke  extends ColdDrink {  

  

    @Override  

    public abstract  String name();  

  

    @Override  

    public abstract  String size();  

      

    @Override  

    public abstract  float price();   

      

}// End of the Coke class

public class SmallPepsi  extends Pepsi{  

  

    @Override  

    public String name() {  

       return “300 ml Pepsi”;  

    }  

  

    @Override  

    public float price() {  

        return 25.0f;  

    }  

  

    @Override  

    public String size() {  

        return “Small Size”;  

    }     

}// End of the SmallPepsi class

File:MediumPepsi.java

public class MediumPepsi extends Pepsi {

@Override

publicString name() {

return “500 ml Pepsi”;

}

@Override

publicString size() {

return “Medium Size”;

}

@Override

publicfloatprice() {

return35.0f;

}

}// End of the MediumPepsi class

File:LargePepsi.java

public class LargePepsi extends Pepsi{  

    @Override  

    public String name() {  

       return “750 ml Pepsi”;  

    }  

  

    @Override  

    public String size() {  

        return “Large Size”;  

    }  

  

    @Override  

    public float price() {  

        return 50.0f;  

    }  

}// End of the LargePepsi class

Step 12:Now, create concrete sub-classes SmallCoke, MediumCoke, LargeCoke that will extend to the abstract class Coke.

public class SmallCoke extends Coke{  

     

    @Override  

    public String name() {  

         return “300 ml Coke”;    

    }  

  

    @Override  

    public String size() {  

         

        return “Small Size”;  

    }  

  

    @Override  

    public float price() {  

      

        return  25.0f;  

    }  

 }// End of the SmallCoke class

File:MediumCoke.java

public class MediumCoke extends Coke {

@Override

publicString name() {

return “500 ml Coke”;

}

@Override

publicString size() {

return “Medium Size”;

}

@Override

publicfloatprice() {

return35.0f;

}

}// End of the MediumCoke class

File:LargeCoke.java

public class LargeCoke extends Coke {  

     @Override  

    public String name() {  

         return “750 ml Coke”;    

    }  

  

    @Override  

    public String size() {  

         

        return “Large Size”;  

    }  

  

    @Override  

    public float price() {  

      

        return  50.0f;  

    }      

}// End of the LargeCoke class

import java.util.ArrayList;

import java.util.List;

public class OrderedItems {

List<Item> items = new ArrayList<Item>();

publicvoidaddItems(Item item) {

items.add(item);

}

publicfloatgetCost() {

floatcost = 0.0f;

for (Item item : items) {

cost += item.price();

}

returncost;

}

publicvoidshowItems() {

for (Item item : items) {

System.out.println(“Item is:” + item.name());

System.out.println(“Size is:” + item.size());

System.out.println(“Price is: ” + item.price());

}

}

}// End of the OrderedItems class

Step 14:Create an OrderBuilder class that will be responsible to create the objects of OrderedItems class.

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class OrderBuilder {

public OrderedItems preparePizza() throws IOException{  

          

        OrderedItems itemsOrder=new OrderedItems();  

         BufferedReader br =new BufferedReader(new InputStreamReader(System.in));  

          

        System.out.println(” Enter the choice of Pizza “);  

        System.out.println(“============================”);  

        System.out.println(        1. Veg-Pizza       );  

        System.out.println(        2. Non-Veg Pizza   );  

        System.out.println(        3. Exit            );  

        System.out.println(“============================”);  

          

        int pizzaandcolddrinkchoice=Integer.parseInt(br.readLine());  

        switch(pizzaandcolddrinkchoice)  

        {  

           case 1:{  

                       

                     System.out.println(“You ordered Veg Pizza”);  

                     System.out.println(“\n\n”);  

                     System.out.println(” Enter the types of Veg-Pizza “);  

                     System.out.println(“——————————“);  

                     System.out.println(        1.Cheeze Pizza        );  

                     System.out.println(        2.Onion Pizza        );  

                     System.out.println(        3.Masala Pizza        );  

                     System.out.println(        4.Exit            );  

                     System.out.println(“——————————“);  

                                  int vegpizzachoice=Integer.parseInt(br.readLine());  

                     switch(vegpizzachoice)  

                     {  

                          case 1:  

                                {  

                                    System.out.println(“You ordered Cheeze Pizza”);  

                                      

                                    System.out.println(“Enter the cheeze pizza size”);  

                                    System.out.println(“————————————“);  

                                    System.out.println(    1. Small Cheeze Pizza “);  

                                    System.out.println(    2. Medium Cheeze Pizza “);  

                                    System.out.println(    3. Large Cheeze Pizza “);  

                                    System.out.println(    4. Extra-Large Cheeze Pizza “);  

                                    System.out.println(“————————————“);  

                                    int cheezepizzasize=Integer.parseInt(br.readLine());  

                                    switch(cheezepizzasize)  

                                        {  

                                              case 1:  

                                                   itemsOrder.addItems(new SmallCheezePizza());  

                                                   break;  

                                             case 2:  

                                                   itemsOrder.addItems(new MediumCheezePizza());  

                                                   break;    

                                             case 3:  

                                                   itemsOrder.addItems(new LargeCheezePizza());  

                                                   break;    

                                             case 4:  

                                                   itemsOrder.addItems(new ExtraLargeCheezePizza());  

                                                   break;      

                          case 2:  

                                {  

                                    System.out.println(“You ordered Onion Pizza”);  

                                    System.out.println(“Enter the Onion pizza size”);  

                                    System.out.println(“———————————-“);  

                                    System.out.println(    1. Small Onion Pizza “);  

                                    System.out.println(    2. Medium Onion Pizza “);  

                                    System.out.println(    3. Large Onion Pizza “);  

                                    System.out.println(    4. Extra-Large Onion Pizza “);  

                                    System.out.println(“———————————-“);  

                                    int onionpizzasize=Integer.parseInt(br.readLine());  

                                    switch(onionpizzasize)  

                                              {  

                                                  case 1:  

                                                   itemsOrder.addItems(new SmallOnionPizza());  

                                                   break;  

                                                      

                                                  case 2:  

                                                   itemsOrder.addItems(new MediumOnionPizza());  

                                                   break;    

                                                     

                                                  case 3:  

                                                   itemsOrder.addItems(new LargeOnionPizza());  

                                                   break;    

                                                        

                                                  case 4:  

                                                   itemsOrder.addItems(new ExtraLargeOnionPizza());  

                                                   break;        

                                                        

                                              }       

                                   }  

                                break;  

                          case 3:  

                                {  

                                    System.out.println(“You ordered Masala Pizza”);  

                                    System.out.println(“Enter the Masala pizza size”);  

                                    System.out.println(“————————————“);  

                                    System.out.println(    1. Small Masala Pizza “);  

                                    System.out.println(    2. Medium Masala Pizza “);   

                                    System.out.println(    3. Large Masala Pizza “);  

                                    System.out.println(    4. Extra-Large Masala Pizza “);  

                                    System.out.println(“————————————“);  

                                                  int masalapizzasize=Integer.parseInt(br.readLine());  

                                        switch(masalapizzasize)  

                                              {  

                                                  case 1:  

                                                   itemsOrder.addItems(new SmallMasalaPizza());  

                                                   break;  

                                                      

                                                  case 2:  

                                                   itemsOrder.addItems(new MediumMasalaPizza());  

                                                   break;    

                                                     

                                                  case 3:  

                                                   itemsOrder.addItems(new LargeMasalaPizza());  

                                                   break;    

                                                        

                                                  case 4:  

                                                   itemsOrder.addItems(new ExtraLargeMasalaPizza());  

                                                   break;        

                                                        

                                              }       

                                   

                                }  

                                break;      

                           

                     }      

                  

                   }  

                   break;// Veg– pizza choice completed.  

                  

            case 2:  

                   {  

                       System.out.println(“You ordered Non-Veg Pizza”);  

                       System.out.println(“\n\n”);  

                         

                                    System.out.println(“Enter the Non-Veg pizza size”);  

                                    System.out.println(“————————————“);  

                                    System.out.println(    1. Small Non-Veg  Pizza “);  

                                    System.out.println(    2. Medium Non-Veg  Pizza “);  

                                    System.out.println(    3. Large Non-Veg  Pizza “);  

                                    System.out.println(    4. Extra-Large Non-Veg  Pizza “);  

                                    System.out.println(“————————————“);  

                                      

                         

                       int nonvegpizzasize=Integer.parseInt(br.readLine());   

                        

                        switch(nonvegpizzasize)  

                             {  

                                 

                                  case 1:  

                                      itemsOrder.addItems(new SmallNonVegPizza());  

                                      break;  

                                                      

                                  case 2:  

                                      itemsOrder.addItems(new MediumNonVegPizza());  

                                      break;    

                                                     

                                  case 3:  

                                      itemsOrder.addItems(new LargeNonVegPizza());  

                                      break;    

                                                        

                                  case 4:  

                                      itemsOrder.addItems(new ExtraLargeNonVegPizza());  

                                      break;        

                              }  

                                      

                       }    

                        break;  

            default:  

            {  

                  break;  

                  

            }  

                  

 }//end of main Switch  

  

                    //continued?..  

        System.out.println(” Enter the choice of ColdDrink “);  

        System.out.println(“============================”);  

        System.out.println(        1. Pepsi            );  

        System.out.println(        2. Coke             );  

        System.out.println(        3. Exit             );  

        System.out.println(“============================”);    

                    int coldDrink=Integer.parseInt(br.readLine());  

        switch (coldDrink)   

            {  

               case 1:  

                                {  

                                    System.out.println(“You ordered Pepsi “);  

                                    System.out.println(“Enter the  Pepsi Size “);  

                                    System.out.println(“————————“);  

                                    System.out.println(    1. Small Pepsi “);  

                                    System.out.println(    2. Medium Pepsi “);  

                                    System.out.println(    3. Large Pepsi “);  

                                    System.out.println(“————————“);  

                                              int pepsisize=Integer.parseInt(br.readLine());  

                                    switch(pepsisize)  

                                              {  

                                                  case 1:  

                                                   itemsOrder.addItems(new SmallPepsi());  

                                                   break;  

                                                      

                                                  case 2:  

                                                   itemsOrder.addItems(new MediumPepsi());  

                                                   break;    

                                                     

                                                  case 3:  

                                                   itemsOrder.addItems(new LargePepsi());  

                                                   break;    

                                                        

                                                }  

                                 }    

                                break;  

                         case 2:  

                                {  

                                    System.out.println(“You ordered Coke”);  

                                    System.out.println(“Enter the Coke Size”);  

                                    System.out.println(“————————“);  

                                    System.out.println(    1. Small Coke “);  

                                    System.out.println(    2. Medium Coke  );  

                                    System.out.println(    3. Large Coke  );  

                                    System.out.println(    4. Extra-Large Coke “);  

                                    System.out.println(“————————“);  

                                      

                                    int cokesize=Integer.parseInt(br.readLine());  

                                    switch(cokesize)  

                                              {  

                                                  case 1:  

                                                   itemsOrder.addItems(new SmallCoke());  

                                                   break;  

                                                      

                                                  case 2:  

                                                   itemsOrder.addItems(new MediumCoke());  

                                                   break;    

                                                     

                                                  case 3:  

                                                   itemsOrder.addItems(new LargeCoke());  

                                                   break;    

                                                        

                                                    

                                              }       

                                   

                                }  

                                break;  

                     default:  

                                      {  

                                                   break;  

                  

                                      }          

                           

                               }//End of the Cold-Drink switch  

                  return itemsOrder;  

  

          } //End of the preparePizza() method  

Step 15:Create a BuilderDemo class that will use the OrderBuilder class.

import java.io.IOException;

public class BuilderDemo {

publicstaticvoidmain(String[] args) throws IOException {

// TODO code application logic here

OrderBuilder builder = new OrderBuilder();

OrderedItems orderedItems = builder.preparePizza();

orderedItems.showItems();

System.out.println(“\n”);

System.out.println(“Total Cost : ” + orderedItems.getCost());

}

}// End of the BuilderDemo class

Popular posts from this blog

How to change column name in Dataframe and selection of few columns in Dataframe using Pyspark with example

What is Garbage collection in Spark and its impact and resolution

Window function in PySpark with Joins example using 2 Dataframes (inner join)