Skip to content
LLD Learn/Creational Patterns
Browsing as a guest. Sign in to save your progress and earn XP as you complete chapters.

Builder: Fluent Construction for Complex Objects

6 min read

You'll learn to

  • -Design a fluent Builder for an object with many optional parameters, avoiding telescoping constructors
  • -Recognize when a Builder is overkill versus when it genuinely clarifies a constructor with 5+ parameters

The Builder pattern separates the construction of a complex object from its representation, letting the same construction process create different configurations. Its most common interview trigger is the "telescoping constructor" problem: a class with many optional parameters, where every combination of optional fields would otherwise need its own constructor overload.

The Problem Builder Solves

Telescoping constructors vs. a fluent Builder
# Before: unreadable at the call site, and grows an overload for every combination
pizza = Pizza("large", "thin", True, False, True, None, 2)  # what do these mean?

# After: self-documenting, and every field is optional with a sensible default
pizza = (PizzaBuilder()
         .size("large")
         .crust("thin")
         .add_cheese()
         .add_topping("mushroom")
         .build())
A minimal fluent Builder
class PizzaBuilder:
    def __init__(self):
        self._size = "medium"
        self._toppings: list[str] = []

    def size(self, size: str) -> "PizzaBuilder":
        self._size = size
        return self                       # returning self is what makes it fluent

    def add_topping(self, topping: str) -> "PizzaBuilder":
        self._toppings.append(topping)
        return self

    def build(self) -> Pizza:
        return Pizza(self._size, self._toppings)

When Builder Is Overkill

A class with two or three parameters, all required, does not need a Builder - a plain constructor is clearer and the pattern would just add indirection. The interview-relevant threshold is roughly: multiple optional parameters (5 or more is a common rule of thumb), where different valid objects use different subsets of them, and where the resulting object should be immutable once built. If every field is required and there is exactly one way to construct the object, reach for a constructor, not a Builder.

Builder pairs naturally with immutability: build() typically returns a fully-formed, immutable object, so once construction finishes there is no way for calling code to leave it in a half-configured state.

Interview Signal is part of Pro

See a real weak answer next to a real strong one for this exact topic.

Quiz is part of Pro

Test what you just read with a short quiz, and bank the XP.

ScaleDojo Logo
Initializing ScaleDojo