🔍 What is the Builder Design Pattern?
The Builder Pattern is a creational design pattern used to construct complex objects step by step. Unlike constructors with numerous parameters, the builder pattern makes object creation more readable, flexible, and maintainable.
✅ When Should You Use It?
- When an object requires many parameters to construct (especially optional ones).
- To prevent a telescoping constructor (multiple constructors with different parameter combinations).
- To make the code more readable and robust.
🧠 Real-World Analogy
Think of building a burger at a fast-food place. You choose bun type, patties, cheese, sauces, toppings, etc. A BurgerBuilder helps you step-by-step and finally gives you the complete burger 🍔.
🧱 Structure
// 1. Product Class
public class Burger {
private String bun;
private String patty;
private boolean cheese;
private boolean lettuce;
private boolean tomato;
private boolean mayo;
// Private constructor, only accessible via Builder
private Burger(BurgerBuilder builder) {
this.bun = builder.bun;
this.patty = builder.patty;
this.cheese = builder.cheese;
this.lettuce = builder.lettuce;
this.tomato = builder.tomato;
this.mayo = builder.mayo;
}
@Override
public String toString() {
return "Burger [bun=" + bun + ", patty=" + patty + ", cheese=" + cheese +
", lettuce=" + lettuce + ", tomato=" + tomato + ", mayo=" + mayo + "]";
}
// 2. Builder Class (Static Nested Class)
public static class BurgerBuilder {
private String bun;
private String patty;
private boolean cheese;
private boolean lettuce;
private boolean tomato;
private boolean mayo;
public BurgerBuilder(String bun, String patty) {
this.bun = bun;
this.patty = patty;
}
public BurgerBuilder addCheese(boolean cheese) {
this.cheese = cheese;
return this;
}
public BurgerBuilder addLettuce(boolean lettuce) {
this.lettuce = lettuce;
return this;
}
public BurgerBuilder addTomato(boolean tomato) {
this.tomato = tomato;
return this;
}
public BurgerBuilder addMayo(boolean mayo) {
this.mayo = mayo;
return this;
}
public Burger build() {
return new Burger(this);
}
}
}
💻 Client Code
public class BuilderPatternDemo {
public static void main(String[] args) {
Burger burger = new Burger.BurgerBuilder("Sesame", "Beef")
.addCheese(true)
.addLettuce(true)
.addTomato(false)
.addMayo(true)
.build();
System.out.println(burger);
}
}
🧪 Output:
Burger [bun=Sesame, patty=Beef, cheese=true, lettuce=true, tomato=false, mayo=true]
⚙️ UML Diagram (Text Format)
+-------------------+
| Burger |
+-------------------+
| -bun |
| -patty |
| -cheese |
| -lettuce |
| -tomato |
| -mayo |
+-------------------+
| +toString() |
+-------------------+
^
|
+----------------------+
| BurgerBuilder |
+----------------------+
| +addCheese() |
| +addLettuce() |
| +addTomato() |
| +addMayo() |
| +build() |
+----------------------+
🧑🏫 Key Takeaways
- Makes object creation readable and avoids messy constructor overloads.
- Supports immutability and encapsulation.
- Flexible and fluent for creating different combinations.
👣 Next Up: Want to explore Singleton, Strategy, or Decorator pattern on Day 3?
Let me know your choice and I’ll keep the same clean format with code, diagrams, and examples!