Padrão Criacional: Construtor
Este artigo discute como objetos complexos podem ser representados e construídos sem acoplar as duas operações.

O que é isso?
O padrão do construtor reduz a quantidade de código necessária para criar objetos. Portanto, se você tem algo complexo para construir, pode simplificar esse processo usando o padrão builder. Um objeto composto ou agregado é o que um construtor geralmente faz.
O padrão builder encapsula o processo de construção de um objeto complexo, separando sua representação de sua construção. Isso nos permite criar diferentes modelos com o mesmo processo de construção. Em linguagem Java, isso significa criar objetos de outras classes que possam compartilhar o mesmo processo de construção.
Diagrama de classe
O diagrama de classes inclui as seguintes entidades:
- Construtor
- construtor de concreto
- Diretor
- produtos

Continuando com nosso exemplo de aviões, digamos que a construção de uma aeronave envolve três etapas:
- a confecção da cabine
- então o motor
- e, finalmente, as asas
Vamos dar uma olhada no código agora. Primeiro, começaremos com a interface abstrata de nossa AircraftBuilder
classe. Em seguida, cada construtor contém métodos que podem ser substituídos por construtores concretos, dependendo se eles incluirão essa parte na variante final do produto que eles são responsáveis pela construção.

Agora vamos implementar dois construtores de concreto, um para o F-16 e outro para o Boeing-747.

Para simplificar, fornecemos o esqueleto dos construtores e ignoramos a implementação individual de cada método. Isso F16Builder
não substitui o buildBathrooms
método porque não há banheiros no cockpit do F-16. O criador do Boeing 747 substitui o método do banheiro, já que o Boeing 747 tem banheiros para os passageiros.
A Director
classe é responsável por registrar o processo ou algoritmo necessário para criar uma aeronave, como a ordem específica em que diferentes partes são feitas. O diretor é como um construtor da aeronave. O produto acabado é devolvido a ele pelos construtores.

Observe que podemos passar no construtor de nossa escolha e variar o produto da aeronave (representação) para ser um F-16 ou um Boeing-747. Em nosso cenário, os construtores retornam supertipos diferentes, mas isso pode não acontecer se eles retornarem produtos que não são muito semelhantes.
O cliente aplicará o padrão desta maneira:

A AircraftBuilder
interface esconde como uma aeronave é construída. O cliente desconhece as classes F16Engine
e F16Cockpit
que são usadas para criar Boeing-747.
Ignorando o Diretor
O padrão Builder é frequentemente usado sem o direcionador. Em vez disso, o cliente pode instanciar diretamente o construtor e invocar os métodos necessários para obter um produto para si mesmo. Este é um antídoto comum para construtores telescópicos. Por exemplo, imagine uma classe com muitos atributos, mas alguns deles podem ser definidos como opcionais. Nesse caso, você pode chamar o construtor apenas para definir os atributos necessários e criar um produto.
Outros exemplos
- A API Java expõe uma
StringBuilder
classe que não está estritamente em conformidade com o padrão do construtor GoF, mas ainda pode ser considerada um exemplo disso. A classe StringBuilder fornece um método append que retorna uma nova string acrescentando caracteres da string original. - Outro exemplo hipotético poderia ser a criação de documentos do tipo pdf ou HTML.

O método acima pode aparecer em um código de cliente ou servidor, e diferentes tipos de documentos podem ser criados passando um diferente DocumentBuilder
para o método. Poderíamos derivar a HtmlDocumentBuilder
e a PdfDocumentBuilder
da classe abstrata DocumentBuilder
.
Ressalvas
Os padrões construtor e fábrica abstrata têm objetivos semelhantes, mas os abordam de maneira diferente. Por exemplo, o padrão builder cria objetos passo a passo, enquanto a fábrica abstrata retorna um objeto de uma só vez.