What is builder design pattern ?
This is used to segregate the logic for creation of complex objects.
For example
If we want to create an object of class representing real Estate residential project . We need to take into account lot of factors in building full fledged object . Object will consist of features like
payment plan
layout
construction plan
builder information
land details
finance details
location details
salient features
and so on.....
So we won't prefer to embed the logic of creation of this instance in actual business logic and unnecessarily clutter the business logic flow Instead It would be good to have a dedicated service which can build up this object and once prepared can return it to business logic . Thus actual business logic remains agnostic of all object creation complexities..
So how do we achieve that in Object oriented language .
Let us try to understand this with code. As usual I have written lot of System.out.println statements in the code to bring are execution flow steps in print statements . This code can be directly copied and executed .All steps of design pattern will be clearly written on console.
-----------------------------------------------------------------------------------------------
//This is the Client class which basically place an order. Here this client first place an order of //commercial project and after it's successful delivery It approaches for residential project and //place an order for that.
package realEstate;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
projectOwner owner=new projectOwner(new CommercialProjectBuilder());
owner.placeRoder();
owner.getProject();
System.out.println("CLIENT :::: Thank you for timely delivry of commerical project");
System.out.println("===============================================================");
System.out.println("CLIENT :::: Now let's deal in residenrial");
owner=new projectOwner(new ResidentialProjectBuilder());
owner.placeRoder();
owner.getProject();
System.out.println("CLIENT :::: Thank you for timely delivry of Residential project.. Rocking performance");
}
}
// This is project Owner . Client passes the type of project It is looking for : commercial or residential //and creates Project Owner instance . Owner will further place order of construction to Commercial //or Residential department based of which object is passed by client
class projectOwner{
ProjectBuiding building;
projectOwner(ProjectBuiding building){
this.building=building;
}
void placeRoder(){
building.constructBase();
building.constructFloors();
building.doFinishing();
building.decorate();
}
ProjectBuiding getProject(){
return building;
}
}
// Interface for Residential and commercial project builder classes
interface ProjectBuiding{
void constructBase();
void constructFloors();
void doFinishing();
void decorate();
}
// entire process and logic of building a residential project is encapsulated in this class
class ResidentialProjectBuilder implements ProjectBuiding {
ResidentialProjectBuilder(){
System.out.println("ResidentialProjectBuilder:::Thank you for reaching us..We deal in Residential Projects..");
}
public void constructBase() {
System.out.println("ResidentialProjectBuilder:::Construction is already started.. Promise to deliver on time ");
}
public void constructFloors() {
System.out.println("ResidentialProjectBuilder::::Construction is on full Swing.. Pay installments timely ");
}
public void doFinishing() {
System.out.println("ResidentialProjectBuilder::::About to deliver .. Have litte more Patience ");
}
public void decorate() {
System.out.println("ResidentialProjectBuilder:::IT is well decorated.. Ready to move");
}
}
// entire process and logic of building a Commercial project is encapsulated in this class
class CommercialProjectBuilder implements ProjectBuiding{
CommercialProjectBuilder(){
System.out.println("CommercialProjectBuilder ::: Thank you for reaching us..We deal in Commercial Projects..");
}
public void constructBase() {
System.out.println("CommercialProjectBuilder :::Construction is already started.. Promise to deliver on time ..");
}
public void constructFloors() {
System.out.println("CommercialProjectBuilder :::Construction is on full Swing.. Pay installments timely ");
}
public void doFinishing() {
System.out.println("CommercialProjectBuilder :::About to deliver .. Have litte more Patience ");
}
public void decorate() {
System.out.println("CommercialProjectBuilder :::IT is well decorated.. Ready to move");
}
}
Below would be the output of console on program execution
-------------------------------------------------------------------------------------------
CommercialProjectBuilder ::: Thank you for reaching us..We deal in Commercial Projects..
CommercialProjectBuilder :::Construction is already started.. Promise to deliver on time ..
CommercialProjectBuilder :::Construction is on full Swing.. Pay installments timely
CommercialProjectBuilder :::About to deliver .. Have litte more Patience
CommercialProjectBuilder :::IT is well decorated.. Ready to move
CLIENT :::: Thank you for timely delivry of commerical project
===============================================================
CLIENT :::: Now let's deal in residenrial
ResidentialProjectBuilder:::Thank you for reaching us..We deal in Residential Projects..
ResidentialProjectBuilder:::Construction is already started.. Promise to deliver on time
ResidentialProjectBuilder::::Construction is on full Swing.. Pay installments timely
ResidentialProjectBuilder::::About to deliver .. Have litte more Patience
ResidentialProjectBuilder:::IT is well decorated.. Ready to move
CLIENT :::: Thank you for timely delivry of Residential project.. Rocking performance