Padrão de construtor C#

Resumo : neste tutorial, você aprenderá como usar o padrão construtor C# para criar um objeto complexo passo a passo.

Introdução ao padrão de construtor C#

O padrão Builder é um padrão de design criacional que separa a construção de um objeto complexo de sua representação para que você possa usar o mesmo processo de construção para criar diferentes representações de um objeto.

Na prática, você usa o padrão Builder para criar objetos que requerem múltiplas etapas, inicialização complexa ou múltiplas configurações.

O diagrama UML a seguir ilustra o padrão Builder:

Padrão de construtor C#

O padrão Builder tem quatro participantes principais:

  • Product: Esta é uma classe de objetos complexos com múltiplas partes.
  • Builder: Esta é uma interface ou classe abstrata que define as etapas para construir o arquivo Product. A Builderinterface possui um conjunto de métodos para definir cada propriedade do produto.
  • ConcreteBuilder: Esta é uma classe concreta que implementa a IBuilderinterface. A ConcreteBuilderclasse possui implementações específicas para cada um dos métodos.
  • Director: esta é uma classe opcional que controla a ordem em que os métodos do construtor são chamados para construir o arquivo Product. A Directorclasse também pode ter lógica adicional para construir o arquivo Product.

O programa a seguir demonstra como implementar o padrão Builder em C#:

using static System.Console;

namespace BuilderPattern;

public class Product
{
    public string PartA {   get; set; }
    public string PartB {   get; set; }
}

public interface IBuilder
{
    IBuilder BuildPartA();
    IBuilder BuildPartB();
    Product GetProduct();
}

public class ConcreteBuilder : IBuilder
{
    public Product _product = new();

    public IBuilder BuildPartA()
    {
        _product.PartA = "Part A";
        return this;
    }

    public IBuilder BuildPartB()
    {
        _product.PartB = "Part B";
        return this;
    }

    public Product GetProduct()
    {
        return _product;
    }
}

public class Director
{
    private readonly IBuilder _builder;

    public Director(IBuilder builder)
    {
        _builder = builder;
    }

    public void Construct()
    {
        _builder.BuildPartA();
        _builder.BuildPartB();
    }
}

public class Client
{
    public static void Main()
    {
        var builder = new ConcreteBuilder();
        
        var director = new Director(builder);
        director.Construct();

        var product = builder.GetProduct();
        WriteLine($"Product Parts: {product.PartA}, {product.PartB}");
    }
}Linguagem de código:  C#  ( cs )

Saída:

Product Parts: Part A, Part BLinguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina um Produto que possui duas partes A e B:

public class Product
{
    public string PartA {   get; set; }
    public string PartB {   get; set; }
}Linguagem de código:  C#  ( cs )

A seguir, defina uma IBuilderinterface que possua métodos para construir o Productobjeto a partir de partes:

public interface IBuilder
{
    IBuilder BuildPartA();
    IBuilder BuildPartB();
    Product GetProduct();
}Linguagem de código:  C#  ( cs )

Em seguida, defina uma ConcreteBuilderclasse que implemente a IBuilderinterface:

public class ConcreteBuilder : IBuilder
{
    public Product _product = new();

    public IBuilder BuildPartA()
    {
        _product.PartA = "Part A";
        return this;
    }

    public IBuilder BuildPartB()
    {
        _product.PartB = "Part B";
        return this;
    }

    public Product GetProduct()
    {
        return _product;
    }
}Linguagem de código:  C#  ( cs )

Depois disso, defina a Directorclasse que constrói Productusando uma instância da IBuilderinterface. O Construct()método usa a IBuilderinstância para construir o arquivo Product.

public class Director
{
    private readonly IBuilder _builder;

    public Director(IBuilder builder)
    {
        _builder = builder;
    }

    public void Construct()
    {
        _builder.BuildPartA();
        _builder.BuildPartB();
    }
}Linguagem de código:  C#  ( cs )

Finalmente, a Clientclasse cria uma ConcreteBuilderinstância, injeta-a no construtor do Directorobjeto e então usa o Directorpara construir o arquivo Product. Ele obtém o Productmétodo GetProduct()do construtor e o mostra no console:

public class Client
{
    public static void Main()
    {
        var builder = new ConcreteBuilder();
        
        var director = new Director(builder);
        director.Construct();

        var product = builder.GetProduct();
        WriteLine($"Product Parts: {product.PartA}, {product.PartB}");
    }
}Linguagem de código:  C#  ( cs )

Resumo

  • Use o padrão Builder para simplificar a construção de objetos complexos e tornar o código mais flexível e de fácil manutenção.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *