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:
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 arquivoProduct
. ABuilder
interface possui um conjunto de métodos para definir cada propriedade do produto.ConcreteBuilder
: Esta é uma classe concreta que implementa aIBuilder
interface. AConcreteBuilder
classe 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 arquivoProduct
. ADirector
classe também pode ter lógica adicional para construir o arquivoProduct
.
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 B
Linguagem 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 IBuilder
interface que possua métodos para construir o Product
objeto a partir de partes:
public interface IBuilder
{
IBuilder BuildPartA();
IBuilder BuildPartB();
Product GetProduct();
}
Linguagem de código: C# ( cs )
Em seguida, defina uma ConcreteBuilder
classe que implemente a IBuilder
interface:
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 Director
classe que constrói Product
usando uma instância da IBuilder
interface. O Construct()
método usa a IBuilder
instâ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 Client
classe cria uma ConcreteBuilder
instância, injeta-a no construtor do Director
objeto e então usa o Director
para construir o arquivo Product
. Ele obtém o Product
mé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.