The Builder Design Pattern

Erik Zhou | Apr 18, 2023 min read

The Builder design pattern is a creational design pattern in software development. This pattern is used when you need to create complex objects step-by-step and want to separate the object construction process from the object representation. In this blog post, we will talk about the Builder design pattern, its benefits, and how to implement it in C#.

What is the Builder Design Pattern?

The Builder pattern is a design pattern that separates the construction of a complex object from its representation, allowing the same construction process to create different representations. This pattern is useful when working with objects that have many optional and required fields.

The Builder pattern abstracts out the object construction process in a separate builder class, which creates the object step-by-step and returns the final object once.

It may not seem like a big deal when the object only has a few parameters that are needed to construct an object. But as the object increases in complexity, the constructor also increases in complexity. This makes instantiating new complex objects very jarring and unmaintainable.

Advantages of the Builder Design Pattern

Here are some key advantages of using the Builder design pattern:

  1. You can construct objects in steps.
  2. You can reuse construction code when creating different representations of the same object.
  3. You can separate the complex construction code from the business logic code of the object.

Implementing the Builder Design Pattern

Now let’s take a look at a simple example to show how to implement the Builder pattern. Let’s say we have a Car class that we need to create different configurations of.

Step 1: Define the main class

First, we need to define the main class (e.g., Car) that we want to build using the Builder pattern. This class should have a private constructor to prevent direct instantiation.

public class Car
{
    public string Make { get; }
    public string Model { get; }
    public int Year { get; }
    public string Color { get; }

    private Car(string make, string model, int year, string color)
    {
        Make = make;
        Model = model;
        Year = year;
        Color = color;
    }
}

Step 2: Create the builder class

Then, we’ll create the builder class that will be responsible for constructing the Car objects step-by-step.

public class CarBuilder
{
    private string _make;
    private string _model;
    private int _year;
    private string _color;

    public CarBuilder SetMake(string make)
    {
        _make = make;
        return this;
    }

    public CarBuilder SetModel(string model)
    {
        _model = model;
        return this;
    }

    public CarBuilder SetYear(int year)
    {
        _year = year;
        return this;
    }

    public CarBuilder SetColor(string color)
    {
        _color = color;
        return this;
    }

    public Car Build()
    {
        return new Car(_make, _model, _year, _color);
    }
}

Step 3: Use the builder to create objects

Finally, we can use the builder class to create Car objects with different configurations.

var carBuilder = new CarBuilder();

var car1 = carBuilder.SetMake("Tesla")
                     .SetModel("Model S")
                     .SetYear(2023)
                     .SetColor("Silver")
                     .Build();

var car2 = carBuilder.SetMake("Honda")
                     .SetModel("Civic")
                     .SetYear(2008)
                     .SetColor("Pink")
                     .Build();

Console.WriteLine($"Car 1: {car1.Make} {car1.Model} {car1.Year} {car1.Color}");
Console.WriteLine($"Car 2: {car2.Make} {car2.Model} {car2.Year} {car2.Color}");

In this example, we’ve shown how to implement the Builder design pattern in C# by creating a car builder. By using the Builder pattern, we can create new car objects with different configurations, without directly instantiating the Car class.