🚀 Capítulo 06: Singleton (Tema: Senhor dos Anéis)

NOTE

Este capítulo utiliza a temática de Senhor dos Anéis para explicar o padrão Singleton. Um Anel para a todos governar! No sistema, só pode existir uma única instância deste objeto.


1. 🎯 Objetivo da Aula

Compreender o padrão de projeto Singleton (Padrão de Criação), entendendo quando e por que utilizá-lo para garantir que uma classe tenha apenas uma única instância em todo o sistema.

2. 🏢 O Cenário Prático (Seu Desafio)

Sauron criou o Anel do Poder. A regra mágica do universo é clara: Existe apenas UM Um Anel.

  • Se o Frodo tentar criar um novo Um Anel, o sistema deve dizer: “Não, use o que já existe”.
  • Se o Gollum tentar criar outro, o sistema retorna o mesmo anel.

No mundo do desenvolvimento, existem objetos que precisam ser únicos.

  • Exemplo: A conexão com o Banco de Dados. Você não quer abrir 1.000 conexões diferentes para o mesmo banco, você quer que todo o sistema use a mesma conexão. Seu desafio é entender como trancar a criação de objetos para garantir a existência de apenas um!

3. 🧠 Fundamentos: A Teoria Traduzida

O Singleton é um padrão de projeto criacional que garante que uma classe tenha apenas uma instância, enquanto fornece um ponto de acesso global para essa instância.

🔒 Como ele funciona?

  1. Construtor Privado: Ele proíbe que outros usem o comando new Classe().
  2. Atributo Estático: Ele guarda a única instância criada dentro dele mesmo.
  3. Método de Acesso (getInstance): Uma função que verifica: “Eu já criei o objeto?“. Se sim, retorna o objeto existente. Se não, cria pela primeira e única vez.

4. 📖 Exemplo Guiado: O Um Anel em Código (JS)

class UmAnel {
    constructor() {
        if (UmAnel.instancia) {
            return UmAnel.instancia; // Retorna a que já existe
        }
        this.poder = "Governar todos";
        UmAnel.instancia = this; // Guarda a primeira instância
    }
}
 
const anelDoFrodo = new UmAnel();
const anelDoGollum = new UmAnel();
 
console.log(anelDoFrodo === anelDoGollum); // true (São exatamente o mesmo objeto!)

5. 🛠️ Prática Obrigatória 1: Cenários de Uso

Diga se as situações abaixo combinam com o uso do padrão Singleton ou não:

  1. O arquivo de configurações do sistema (onde fica guardado o tema escuro/claro e o idioma).
  2. Os produtos de um carrinho de compras de um e-commerce.
  3. O gerenciador de logs do sistema (que escreve os erros em um arquivo txt).

6. 🛠️ Prática Obrigatória 2: O Perigo Global

O Singleton funciona como uma variável global disfarçada. Se qualquer parte do código pode acessar e alterar o Singleton do “Um Anel”, o que acontece se um código malicioso mudar o poder do anel? Por que devemos usar o Singleton com cuidado?


7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 06 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_06_singleton.md
│   └── codigos/
│       └── cap06/
│           └── um_anel.js

9. 💡 Checkpoint de Lógica

Se o padrão Singleton impede o uso livre do new, como o próprio desenvolvedor cria a primeira instância? (Dica: O método getInstance faz isso internamente).

10. 🔥 Desafio de Fixação

Pesquise como implementar o padrão Singleton em linguagens fortemente tipadas como Java ou C#, onde o construtor precisa ser explicitamente declarado como private.

🔑 Gabarito de Código/Fórmulas

Gabarito da Prática 1:

  1. Sim (Você quer que todo o sistema leia as mesmas configurações).
  2. Não (Cada usuário tem seu próprio carrinho, não pode ser uma instância única para todos).
  3. Sim (Um único gerenciador centralizando a gravação dos logs).

Capitulo Anterior | Proximo Capitulo