🚀 Capítulo 09: Builder (Tema: Lego)
NOTE
Este capítulo utiliza a temática de Lego para explicar o padrão Builder. Construir um castelo complexo peça por peça, passo a passo, é muito melhor do que tentar montar tudo de uma vez só!
1. 🎯 Objetivo da Aula
Compreender o padrão de projeto Builder (Padrão de Criação), entendendo como ele permite a criação de objetos complexos passo a passo e evita o problema dos construtores gigantescos.
2. 🏢 O Cenário Prático (Seu Desafio)
Você está criando um jogo onde o jogador pode construir seu próprio Castelo de Lego. Um castelo pode ter muitos elementos opcionais:
- Muralhas, Torres, Portão Principal, Fosso com Jacarés, Estátua de Dragão, etc.
Se você fosse criar o objeto Castelo da forma tradicional, o comando ficaria assim:
const meuCastelo = new Castelo(4, 2, true, true, false, "pedra", 100);
O que significa esse true, true, false? É difícil de ler e de manter! E se eu quiser um castelo sem dragão, mas com fosso?
Seu desafio é usar o padrão Builder para criar o castelo peça por peça, de forma legível!
3. 🧠 Fundamentos: A Teoria Traduzida
O Builder (Construtor) é um padrão de projeto criacional que permite 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.
🧱 O Problema do Construtor Telescópico
Acontece quando uma classe tem muitos parâmetros opcionais no construtor. Você acaba criando vários construtores ou passando muitos valores null ou false.
⚡ A Solução Builder
Você cria uma classe auxiliar (o Builder) que tem métodos para adicionar cada peça. Cada método retorna o próprio Builder (isso permite encadear os comandos com pontos). No final, você chama o método build() para receber o objeto pronto.
4. 📖 Exemplo Guiado: Construindo o Castelo (JS)
class Castelo {
constructor() {
this.torres = 0;
this.temFosso = false;
this.temDragao = false;
}
}
class CasteloBuilder {
constructor() {
this.castelo = new Castelo();
}
adicionarTorres(quantidade) {
this.castelo.torres = quantidade;
return this; // Permite encadear
}
adicionarFosso() {
this.castelo.temFosso = true;
return this;
}
adicionarDragao() {
this.castelo.temDragao = true;
return this;
}
construir() {
return this.castelo;
}
}
// CONSTRUÇÃO PASSO A PASSO
const meuCastelo = new CasteloBuilder()
.adicionarTorres(4)
.adicionarFosso()
.construir(); // Não adicionei dragão!
console.log(meuCastelo);5. 🛠️ Prática Obrigatória 1: Criando um Monstro
Imagine que você quer criar um castelo com 10 torres e um dragão de guarda, mas sem fosso.
- Escreva a linha de código (usando o encadeamento de métodos do Builder) para criar esse castelo.
6. 🛠️ Prática Obrigatória 2: Legibilidade vs Simplicidade
O padrão Builder exige que criemos uma classe extra (a classe Builder) além da classe do objeto real. Vale a pena escrever mais código e criar mais classes só para deixar a criação do objeto mais legível? Em que tipo de objetos isso vale a pena?
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 09 Paradigmas) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
mod_10_paradigmas_e_padroes_de_projeto/
├── capitulos/
│ ├── capitulo_09_builder.md
│ └── codigos/
│ └── cap09/
│ └── construtor_lego.js9. 💡 Checkpoint de Lógica
Por que os métodos do Builder precisam terminar com return this;? O que aconteceria se tirássemos essa linha? (Dica: Tente imaginar como ficaria a chamada sem os pontos encadeados).
10. 🔥 Desafio de Fixação
Pesquise como o padrão Builder é usado na criação de strings complexas em linguagens como Java (com a classe StringBuilder).
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1:
const casteloMonstro = new CasteloBuilder()
.adicionarTorres(10)
.adicionarDragao()
.construir();