Builder
Pattern
Construa objetos complexos passo a passo, separando a construção da representação final.
O que é um
Padrão de Projeto?
Padrões de projeto são soluções típicas para problemas recorrentes no design de software orientado a objetos. Funcionam como plantas arquitetônicas que podem ser adaptadas para resolver problemas específicos no seu código.
Diferente de um algoritmo (que define passos claros para atingir uma meta), um padrão é uma descrição de alto nível de uma solução. Pense assim: um algoritmo é uma receita de comida, com etapas claras. Um padrão é uma planta de obra, onde você vê o resultado final e suas funcionalidades, mas a ordem exata de implementação depende de você.
"O padrão não é um pedaço de código específico, mas um conceito geral para resolver um problema em particular."
Refactoring.GuruPropósito
Descreve brevemente o problema e a solução que o padrão endereça.
Motivação
Explica a fundo o problema e como a solução proposta pelo padrão é viável.
Estrutura
Mostra as classes e objetos envolvidos e como eles se relacionam entre si.
Por que aprender
Padrões de Projeto?
Padrões de projeto são um toolkit de soluções testadas e aprovadas para problemas comuns. Mesmo que você nunca encontre exatamente esses problemas, conhecê-los ensina a resolver todo tipo de desafio usando princípios de design orientado a objetos.
Além disso, padrões definem uma linguagem comum que facilita a comunicação entre desenvolvedores. Ao dizer "use um Builder aqui", toda a equipe entende imediatamente a estrutura proposta, sem precisar de longas explicações.
Reutilização
Soluções prontas que economizam tempo e reduzem bugs conhecidos no design do software.
Comunicação
Vocabulário compartilhado entre devs. "Builder", "Singleton", "Observer" carregam significado imediato.
Arquitetura
Ensinam princípios de design que melhoram toda a qualidade do código produzido.
Classificação
dos Padrões
Os 23 padrões clássicos do GoF (Gang of Four) são divididos em três categorias com base no seu propósito: Criacionais, Estruturais e Comportamentais.
● Criacionais
Mecanismos de criação de objetos que aumentam flexibilidade e reutilização.
● Estruturais
Como montar objetos e classes em estruturas maiores mantendo flexibilidade.
● Comportamentais
Algoritmos e designação de responsabilidades entre objetos.
O Propósito
Construir objetos complexos passo a passo
O Builder permite produzir diferentes tipos e representações de um objeto usando o mesmo código de construção, sem precisar de um construtor com dezenas de parâmetros.
"O Builder é um padrão de projeto criacional que permite a você construir objetos complexos passo a passo. O padrão permite que você produza diferentes tipos e representações de um objeto usando o mesmo código de construção."
Refactoring.Guru — Builder PatternO Problema
Imagine um objeto complexo que necessita de inicialização passo a passo de muitos campos e objetos agrupados. Esse tipo de código de inicialização normalmente fica enterrado dentro de um construtor monstruoso com muitos parâmetros. Ou pior: espalhado por todo o código cliente.
A Analogia da Casa
Para construir uma casa simples, você precisa de paredes, piso, porta, janelas e telhado. Mas e se quiser uma casa maior, com jardim, sistema de aquecimento, encanamento e fiação elétrica?
A abordagem mais simples seria estender a classe base e criar subclasses para cada configuração possível. Mas isso rapidamente leva a uma explosão de subclasses.
Outra opção seria um construtor gigantesco com todos os parâmetros possíveis na classe base. Elimina subclasses, mas cria chamadas monstruosas onde a maioria dos parâmetros fica sem uso.
Observe a construção passo a passo...
A Solução
O padrão Builder sugere extrair o código de construção do objeto para fora da própria classe e movê-lo para objetos separados chamados builders. O padrão organiza a construção em uma série de etapas (construirParedes(), construirPorta(), etc.). Para criar um objeto, você executa apenas as etapas necessárias.
A parte crucial: você não precisa chamar todas as etapas. Pode invocar apenas aquelas que são necessárias para produzir uma configuração específica.
Interface Builder
Define todas as etapas de construção possíveis, comuns a todos os tipos de builders.
Concrete Builders
Implementam as etapas de construção de formas diferentes. Cada builder pode produzir um produto completamente diferente.
Produtos
São os objetos resultantes. Produtos de builders diferentes não precisam compartilhar a mesma interface.
Director (Opcional)
Define a ordem de execução das etapas de construção. Encapsula receitas comuns de construção para reutilização.
Estrutura do Padrão Builder
+ setParedes(...)
+ setPortas(...)
+ setJanelas(...)
+ setTelhado(...)
+ reset()
+ setParedes(...)
+ setPortas(...)
+ getResultado(): Casa
- portas: number
- janelas: number
- temPiscina: bool
- temGaragem: bool
+ construirCasaSimples()
+ construirMansao()
orquestrar a construção
Builder Interativo
Clique nas etapas para construir seu objeto passo a passo. Veja o output em tempo real.
ETAPAS DE CONSTRUÇÃO
Quando Aplicar
o Builder?
🔩 Objetos com muitas configurações opcionais
Quando o construtor da classe tem 5, 10, 15 parâmetros opcionais, o Builder elimina o "construtor telescópico" e torna a criação legível.
🌲 Construção de árvores Composite ou estruturas complexas
O Builder permite construir produtos passo a passo e defer a execução de algumas etapas sem quebrar o resultado final. Isso é útil para montar árvores de objetos recursivamente.
🔄 Produtos com diferentes representações
Quando o mesmo processo de construção deve produzir representações diferentes do produto (ex: um carro real vs. um manual do carro), builders concretos diferentes resolvem isso.
📦 Isolamento do produto em construção
O Builder mantém o produto privado durante a construção. O código cliente nunca recebe um objeto incompleto ou em estado instável.
Exemplos do Mundo Real
| Contexto | Builder | Produto |
|---|---|---|
| Query SQL | QueryBuilder | String SQL (SELECT...WHERE...) |
| HTTP Request | RequestBuilder | Objeto Request configurado |
| Docker Compose | ServiceBuilder | docker-compose.yaml |
| K8s Manifests | DeploymentBuilder | Deployment + Service + Ingress |
| StringBuilder | append(), insert() | String final otimizada |
Exemplo Prático
em Go
No exemplo abaixo temos dois builders concretos: NormalBuilder e IglooBuilder. Ambos implementam a mesma interface IBuilder, mas constroem casas completamente diferentes.
Prós e Contras
✅ Prós
❌ Contras
Relação com
Outros Padrões
Builder + Bridge
A classe Director age como abstração, enquanto diferentes builders agem como implementações.
Builder + Composite
O Builder pode ser utilizado para construir árvores Composite passo a passo, incluindo chamadas recursivas.
Builder vs. Abstract Factory
Abstract Factory se foca em famílias de objetos relacionados. Builder se foca na construção passo a passo de um objeto complexo.
Builder como Singleton
Builders, Fábricas Abstratas e Protótipos podem todos ser implementados como Singletons quando necessário.
O Builder em
uma frase
"Separe a construção de um objeto complexo da sua representação para que o mesmo processo de construção possa criar diferentes representações."
Gang of Four — Design Patterns (1994)Tipo
Criacional
Participantes
Builder, ConcreteBuilder, Product, Director
Representações
Um processo, infinitos produtos diferentes