Tópico 04 - Singleton

Tópico 04: Singleton

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Roteiro

  • Ideia do Singleton
  • Problema que resolve
  • Implementação básica em Java
  • Cuidados e anti‑padrão
  • Variações úteis
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

O que é Singleton?

  • Garante apenas uma instância de uma classe
  • Fornece um ponto global de acesso
  • Muito usado para:
    • configurações
    • log central
    • gerenciadores/caches únicos
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Problema

Alguns recursos devem ser únicos na aplicação:

  • Configurações da aplicação
  • Serviço de log
  • Gerenciador de conexões

Se cada módulo fizer new:

  • configurações diferentes espalhadas
  • consumo excessivo de recursos
  • difícil coordenar quem manda no estado
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Ideia da Solução

  • Construtor privado → ninguém faz new por fora
  • Campo estático → guarda a instância única
  • Método estático (getInstancia) → devolve sempre o mesmo objeto

Fluxo:

  1. Primeira chamada → cria a instância
  2. Próximas chamadas → reutilizam a mesma instância
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Singleton simples em Java

public class ConfiguracaoSistema {
  private static ConfiguracaoSistema instancia;

  private ConfiguracaoSistema() {
    // carregar config, por exemplo
  }

  public static ConfiguracaoSistema getInstancia() {
    if (instancia == null) {
      instancia = new ConfiguracaoSistema();
    }
    return instancia;
  }
}
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Uso:

ConfiguracaoSistema c1 = ConfiguracaoSistema.getInstancia();
ConfiguracaoSistema c2 = ConfiguracaoSistema.getInstancia();
System.out.println(c1 == c2); // true
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Analogia

  • Central de emergências (tipo 190/192/193):

    • Vários telefones, uma mesma central
    • Vários módulos do sistema, uma mesma instância
  • Não faz sentido cada telefone ter sua própria “mini central”

  • Singleton funciona como esse serviço único na aplicação

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Quando usar Singleton?

  • Precisa de uma única instância:
    • config global
    • logger
    • cache em memória
  • Precisa de ponto de acesso central
  • Cuidado: use onde unicidade faz sentido de verdade (não por preguiça)
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Quando é problema? (Anti‑padrão)

  • Vira variável global chique
  • Aumenta acoplamento (todo mundo chama getInstancia())
  • Dificulta testes (estado global entre testes)
  • Em cenários multiusuário ou multi‑thread pode gerar:
    • dados misturados
    • condições de corrida

Regra: use só quando unicidade é um requisito real.

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Singleton e Testes

public class Logger {
  private static Logger instancia = new Logger();
  private Logger() { }

  public static Logger getInstancia() { return instancia; }

  public void log(String msg) {
    System.out.println(msg);
  }
}
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Problema em testes:

  • Não dá para trocar Logger por um mock facilmente
  • Estado e saída se misturam entre testes

Solução comum: preferir injeção de dependência em vez de Singletons diretos.

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Singleton com enum (forma segura)

public enum CentralEmergencia {
  INSTANCIA;

  public void atender(String tipo) {
    System.out.println("Atendendo: " + tipo);
  }
}
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Uso:

CentralEmergencia c1 = CentralEmergencia.INSTANCIA;
CentralEmergencia c2 = CentralEmergencia.INSTANCIA;
System.out.println(c1 == c2); // true
  • Thread‑safe
  • Simples
  • Lida bem com serialização
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Prós

  • Garante uma única instância
  • Acesso simples: MinhaClasse.getInstancia()
  • Pode usar lazy loading (criar só quando precisar)
  • Centraliza configuração/estado compartilhado
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Contras

  • Acoplamento global
  • Dificulta testes unitários
  • Pode violar SRP (vira “objeto Deus”)
  • Implementação ingênua não é thread‑safe
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 04 - Singleton

Resumo

  • Singleton: uma instância + acesso global controlado
  • Útil para recursos realmente únicos
  • Use com cuidado: fácil virar anti‑padrão
  • Considere alternativas:
    • injeção de dependências
    • gerenciamento por contêiner (ex.: Spring singleton scope)
Design Patterns - Professor Ramon Venson - SATC 2026.1