El patrón Builder es un patrón de diseño que se utiliza para separar la construcción de un objeto complejo de su representación, de manera que el mismo proceso de construcción pueda crear diferentes representaciones.

Este patrón es útil en situaciones en las que hay una clase compleja con muchos parámetros, y se quiere evitar un constructor con una larga lista de argumentos.

Aquí hay un ejemplo de implementación en C#:

// La clase abstracta Builder
abstract class PizzaBuilder
{
    protected Pizza pizza;

    public Pizza GetPizza()
    {
        return pizza;
    }

    public void CreateNewPizzaProduct()
    {
        pizza = new Pizza();
    }

    public abstract void SetDough();
    public abstract void SetSauce();
    public abstract void SetTopping();
}

// La clase ConcreteBuilder
class HawaiianPizzaBuilder : PizzaBuilder
{
    public override void SetDough()
    {
        pizza.Dough = "cross";
    }

    public override void SetSauce()
    {
        pizza.Sauce = "mild";
    }

    public override void SetTopping()
    {
        pizza.Topping = "ham+pineapple";
    }
}

// La clase Product
class Pizza
{
    private string dough = "";
    private string sauce = "";
    private string topping = "";

    public string Dough
    {
        get { return dough; }
        set { dough = value; }
    }

    public string Sauce
    {
        get { return sauce; }
        set { sauce = value; }
    }

    public string Topping
    {
        get { return topping; }
        set { topping = value; }
    }
}

// La clase Director
class Waiter
{
    private PizzaBuilder pizzaBuilder;

    public void SetPizzaBuilder(PizzaBuilder pb)
    {
        pizzaBuilder = pb;
    }

    public Pizza GetPizza()
    {
        return pizzaBuilder.GetPizza();
    }

    public void ConstructPizza()
    {
        pizzaBuilder.CreateNewPizzaProduct();
        pizzaBuilder.SetDough();
        pizzaBuilder.SetSauce();
        pizzaBuilder.SetTopping();
    }
}

// La clase Cliente
class PizzaStore
{
    static void Main(string[] args)
    {
        Waiter waiter = new Waiter();
        PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder();

        waiter.SetPizzaBuilder(hawaiianPizzaBuilder);
        waiter.ConstructPizza();

        Pizza pizza = waiter.GetPizza();
    }
}


En este ejemplo, el director (Waiter) actúa como intermediario entre la clase de construcción (PizzaBuilder) y la clase de producto (Pizza). La clase de construcción (HawaiianPizzaBuilder) define cómo se construirá la pizza y el director