Skip to main content

Command Palette

Search for a command to run...

Week 4: The Builder Pattern Explained Simply

Design Patterns Demystified Series

Published
4 min read
Week 4: The Builder Pattern Explained Simply

Welcome to our Design Patterns Demystified series!
This week, we’re examining the Builder Pattern — a simpler approach to creating complex objects step by step, another classic from the Gang of Four (GoF).

Let’s break it down the simple way — with plain language, real-world analogies, and working code.


🍔 Real-World Analogy: The Burger Shop

Imagine walking into a burger cafe. You tell the Manager what kind of burger you want — “a Classic Beef Burger” or “a Veggie Burger.”

Here’s what happens behind the counter:

  • The Chef (Builder) prepares the burger step by step:
    adds the bun 🍞, places the patty 🍖 or 🥦, adds cheese 🧀, lettuce 🥬, tomato 🍅, and sauce.

  • The Manager (Director) doesn’t make the burger; they just direct the Chef which combination to use.

  • The Customer (Client) only sees the finished burger — not how it was made.


☕ Let’s Translate That Into Code

🧱 Step 1: Product Class – Burger.java

package com.designpatterns.creationalpatterns.builder;

public class Burger {

    private String bun;
    private String patty;
    private boolean cheese;
    private boolean lettuce;
    private boolean tomato;
    private boolean sauce;

    protected Burger(BurgerBuilder builder) {
        this.bun = builder.getBun();
        this.patty = builder.getPatty();
        this.cheese = builder.hasCheese();
        this.lettuce = builder.hasLettuce();
        this.tomato = builder.hasTomato();
        this.sauce = builder.hasSauce();
    }

    @Override
    public String toString() {
        return "Burger prepared with " + patty + " patty and " + bun + " bun with " +
                (cheese ? "cheese " : "no cheese ") +
                (tomato ? "tomato " : "no tomato ") +
                (lettuce ? "lettuce " : "no lettuce ") +
                (sauce ? "sauce " : "no sauce ");
    }
}

🧱 Step 2: Builder Class – BurgerBuilder.java

package com.designpatterns.creationalpatterns.builder;

public class BurgerBuilder {
    private String bun;
    private String patty;
    private boolean cheese;
    private boolean lettuce;
    private boolean tomato;
    private boolean sauce;

    public BurgerBuilder setBun(String bun) {
        this.bun = bun;
        return this;
    }

    public BurgerBuilder setPatty(String patty) {
        this.patty = patty;
        return this;
    }

    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 addSauce(boolean sauce) {
        this.sauce = sauce;
        return this;
    }

    public Burger build() {
        return new Burger(this);
    }

    // Getters
    public String getBun() { return bun; }
    public String getPatty() { return patty; }
    public boolean hasCheese() { return cheese; }
    public boolean hasLettuce() { return lettuce; }
    public boolean hasTomato() { return tomato; }
    public boolean hasSauce() { return sauce; }
}

🧱 Step 3: Director Class – Manager.java

package com.designpatterns.creationalpatterns.builder;

public class Manager {

    public Burger buildClassicBurger() {
        return new BurgerBuilder()
            .setBun("Sesame")
            .setPatty("Beef")
            .addCheese(true)
            .addLettuce(true)
            .addTomato(true)
            .build();
    }

    public Burger buildVegBurger() {
        return new BurgerBuilder()
            .setBun("Whole Wheat")
            .setPatty("Veggie")
            .addCheese(false)
            .addLettuce(true)
            .addTomato(true)
            .build();
    }
}

🧱 Step 4: Client Class – Cafe.java

package com.designpatterns.creationalpatterns.builder;

public class Cafe {
    public static void main(String[] args) {
        Manager manager = new Manager();

        // Customer orders
        Burger classic = manager.buildClassicBurger();
        System.out.println(classic);

        Burger veg = manager.buildVegBurger();
        System.out.println(veg);
    }
}

Output:

Burger prepared with Beef patty and Sesame bun with cheese tomato lettuce no sauce
Burger prepared with Veggie patty and Whole Wheat bun with no cheese tomato lettuce no sauce

🎯 What This Demonstrates

  • The Builder Pattern separates construction (how something is built) from representation (what it is).

  • You can create different types of burgers (objects) using the same step-by-step process.

  • The Manager (Director) encapsulates specific recipes, while the Builder defines how to assemble each part.

  • The Client simply calls a high-level method — no need to worry about construction details.


🧠 Why Use the Builder Pattern?

👍 Advantages:

  • Avoids telescoping constructors (too many parameters)

  • Makes code readable and flexible

  • Allows different representations of the same object

  • Promotes immutability (the final product can be made immutable)

📌 When to Use It:

  • When your object has many optional parameters

  • When you want controlled construction with validation steps

  • When building complex, layered objects (e.g., documents, meals, UI screens, reports)


🏗️ Real-World Use Cases

  • Building configuration objects (e.g., HTTP requests, user settings)

  • Constructing meals in restaurant/order systems

  • Generating complex reports with optional sections

  • Creating game characters or GUI forms step-by-step


🔜 Next up: The Prototype Pattern!

Next week, we’ll explore how to clone existing objects efficiently without depending on their exact classes — perfect for when you need object duplication with variations.

Stay tuned as we break it down with beginner-friendly code examples, analogies, and practical use cases.
We’ll help you write cleaner, more flexible, and more readable object construction code — one pattern at a time.


✅ Call to Action (CTA)

🚀 Want to level up your design pattern skills?
Subscribe or follow the series — we’ll walk through each pattern with examples, analogies, and real-world code you can use today.


Note: AI-generated Image

Design Patterns

Part 5 of 25

Let’s be honest—most devs would rather code than study design patterns. They seem academic and full of jargon. But this guide is different: plain language, real-life analogies, and practical examples that make your code smarter, cleaner, and scalable

Up next

Week 5: The Prototype Pattern Explained Simply

Design Patterns Demystified Series