The Step Builder pattern is a variation of the standard Builder pattern in Java that guides the
client through the object construction process step-by-step using a series of defined
interfaces. This approach guarantees that all required fields are initialized in a specific order
and prevents the creation of an inconsistent object state before it is fully configured.
Key Concepts
Enforced Order: The pattern uses chained interfaces to ensure the user calls
methods in a predefined, mandatory sequence. The build() method is only available
in the final step interface.
Immutability: It promotes creating immutable "Product" objects, as the construction
is separate from the final representation.
Readability: It provides a highly readable, "fluent" API that acts like a guided
"wizard" for object creation.
Compile-time Safety: Errors related to missing mandatory fields or incorrect
sequences are caught at compile time, rather than runtime.
Implementation Steps
The core idea is to define a series of nested interfaces, each one returning the next interface
in the sequence, until the final BuildStep is reached.
1. Product Class: Create the complex object class with a private constructor that
accepts all final parameters.
2. Define Step Interfaces: Define public nested interfaces
(e.g., NameStep, ClassStep, BuildStep) within a static builder class. Each method in an
interface should return the next required step's interface, with the final interface
providing the build() method.
3. Implement All Steps: Create a private static inner class that implements all the step
interfaces. This inner class holds the intermediate values.
4. Implement Methods: Implement the methods in the inner class, setting the
corresponding field and returning this (which is cast to the next step's interface,
either implicitly or explicitly). The build() method creates the final Product object
using the private constructor.
5. Start Method: Provide a static entry point method (e.g., newBuilder()) in the builder
class that returns the first step interface.
Example (Conceptual)
For a Car object with required make and model fields, and optional color and gps fields:
java
public class Car {
// ... private final fields and private constructor ...
public static MakeStep builder() {
return new Steps();
public interface MakeStep {
ModelStep make(String make);
public interface ModelStep {
BuildStep model(String model);
public interface BuildStep {
BuildStep color(String color); // Optional steps return BuildStep
BuildStep gps(boolean hasGps); //
Car build(); // Final step
private static class Steps implements MakeStep, ModelStep, BuildStep {
// ... field implementations and methods ...
Use code with caution.
Usage in client code becomes a type-safe, guided sequence:
java
Car car = [Link]()
.make("Ford") // Returns ModelStep
.model("Mustang") // Returns BuildStep
.color("Red") // Returns BuildStep
.build(); // Creates the final Car object
Use code with caution.
This forces the developer to provide the make and model before being able to call build().