🚀 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.

  1. 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)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 09 Paradigmas) e clique em Commit to main.
  2. 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.js

9. 💡 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();

Capitulo Anterior | Proximo Capitulo