Builder Pattern Coding Explanation Part 2

Part 1 we dig deep into builder concept now we’r building our own custom builder.
- Let’s take a house class example having rooms, window & parking. we kept our attribute variable so keep it non editable.
class House {
private final Integer rooms; // kept variable private & final so only
private final Integer window; // going to be initialise once
private final Integer parking;
private final String houseType;
}
2. Defining private parameterised constructor
class House {
private final Integer rooms; // kept variable private & final so only
private final Integer window; // going to be initialise once
private final Integer parking;
private final String houseType;
// parametrised constructor injecting all attributes
private House(Integer rooms, Integer window,
Integer parking, Integer houseType) {
this.rooms = rooms;
this.window = window;
this.parking = parking;
this.houseType = houseType;
}
}
3. Defining nested house builder class. we need to duplicate all the attribute in nested class. we kept attributes editable in builder by defining not final.
class House {
private final Integer rooms; // kept variable private & final so only
private final Integer window; // going to be initialise once
private final Integer parking;
private final String houseType;
// parametrised constructor injecting all attributes
private House(Integer rooms, Integer window,
Integer parking, Integer houseType) {
this.rooms = rooms;
this.window = window;
this.parking = parking;
this.houseType = houseType;
}
// Nested builder class
public static class HouseBuilder {
private Integer rooms; // Duplicating variables keeping non-final
private Integer window; //to allows editing
private Integer parking;
private String houseType;
}
}
5. Adding builder setter method returning house builder object to allow method chain calling.
class House {
private final Integer rooms; // kept variable private & final so only
private final Integer window; // going to be initialise once
private final Integer parking;
private final String houseType;
// parametrised constructor injecting all attributes
private House(Integer rooms, Integer window,
Integer parking, Integer houseType) {
this.rooms = rooms;
this.window = window;
this.parking = parking;
this.houseType = houseType;
}
// Nested builder class
public static class HouseBuilder {
private Integer rooms; // Duplicating variables but not keeping it’s
private Integer window; // final to allows editing
private Integer parking;
private String houseType;
// add builder setter method returning house builder to allow method chain calling
public HouseBuilder rooms(Integer rooms) {
this.rooms = rooms;
return this;
}
public HouseBuilder window(Integer window) {
this.window = window;
return this;
}
public HouseBuilder parking(Integer parking) {
this.parking = parking;
return this;
}
public HouseBuilder houseType(String houseType) {
this.houseType = houseType;
return this;
}
}
}
6. Defining result method to finally initialise the house object. once result is executed house object is created then editing is not allowed. adding print method also to view our result.
class House {
private final Integer rooms; // kept variable private & final so only
private final Integer window; // going to be initialise once
private final Integer parking;
private final String houseType;
// parametrised constructor injecting all attributes
private House(Integer rooms, Integer window,
Integer parking, Integer houseType) {
this.rooms = rooms;
this.window = window;
this.parking = parking;
this.houseType = houseType;
}
// Adding to string method to view our result
@Override
public String toString() {
return “House{“ +
“rooms=’” + rooms + ‘\’’ +
“, window=” + window +
“, parking=’” + parking + ‘\’’ +
“, houseType=’” + houseType + ‘\’’ +
‘}’;
}
// Nested builder class
public static class HouseBuilder {
private Integer rooms; // Duplicating variables but not keeping it’s
private Integer window; // final to allows editing
private Integer parking;
private String houseType;
// add builder setter method returning house builder to allow method chain calling
public HouseBuilder rooms(Integer rooms) {
this.rooms = rooms;
return this;
}
public HouseBuilder window(Integer window) {
this.window = window;
return this;
}
public HouseBuilder parking(Integer parking) {
this.parking = parking;
return this;
}
public HouseBuilder houseType(String houseType) {
this.houseType = houseType;
return this;
}
// finally actual house object is created once result is executed new house is returned
public House result() {
return new House(this.rooms, this.window,
this.parking, this.houseType);
}
}
}
7. We need to allow easy access of builder object so doing static method initialisation. every time HouseBuilder is executed return new instance of builder.
class House {
private final Integer rooms; // kept variable private & final so only
private final Integer window; // going to be initialise once
private final Integer parking;
private final String houseType;
// parametrised constructor injecting all attributes
private House(Integer rooms, Integer window,
Integer parking, Integer houseType) {
this.rooms = rooms;
this.window = window;
this.parking = parking;
this.houseType = houseType;
}
// every time HouseBuilder is executing it’s return brand new builder
public static HouseBuilder HouseBuilder() {
return new HouseBuilder();
}
// Adding to string method to view our resule
@Override
public String toString() {
return “House{“ +
“rooms=’” + rooms + ‘\’’ +
“, window=” + window +
“, parking=’” + parking + ‘\’’ +
“, houseType=’” + houseType + ‘\’’ +
‘}’;
}
// Nested builder class
public static class HouseBuilder {
private Integer rooms; // Duplicating variables but not keeping it’s
private Integer window; // final to allows editing
private Integer parking;
private String houseType;
// add builder setter method returning house builder to allow method chain calling
public HouseBuilder rooms(Integer rooms) {
this.rooms = rooms;
return this;
}
public HouseBuilder window(Integer window) {
this.window = window;
return this;
}
public HouseBuilder parking(Integer parking) {
this.parking = parking;
return this;
}
public HouseBuilder houseType(String houseType) {
this.houseType = houseType;
return this;
}
// finally actual house object is created once result is executed new house is returned
public House result() {
return new House(this.rooms, this.window,
this.parking, this.houseType);
}
}
}
Phew! finally our house & housebuilder is completed now time to run our code, adding main method to run code.
public static void main(String[] args) {
// Luxury house with 8 rooms 12 window & 3 parking
House luxuryHouse = House.HouseBuilder()
.rooms(5)
.rooms(8) // editable field
.window(12)
.parking(3)
.houseType(“LUXURY_HOUSE”)
.result(); // only now the final house is created
// Cheap house with 2 rooms 4 window & no parking
House CheapHouse = House.HouseBuilder()
.rooms(2)
.window(4)
.houseType(“CHEAP_HOUSE”)
.result(); // only now the final house is created
System.out.println(luxuryHouse.toString());
System.out.println(CheapHouse.toString());
}
Running code:
