Singleton


Criação de objetos

O que são Design Patterns?

Design Patterns (ou Padrões de Projeto) são soluções reutilizáveis para problemas comuns no desenvolvimento de software. Eles não são frameworks ou bibliotecas, mas sim orientações arquiteturais que ajudam a organizar melhor seu código.

Foi no livro “Design Patterns: Elements of Reusable Object-Oriented Software” (conhecido como Gang of Four), que esses padrões se popularizaram.

Aprender Design Patterns muda a forma como você pensa soluções, colabora com outros devs, entende bases de código legadas e até como você se destaca em entrevistas.

Descrição

O padrão Singleton garante que uma classe tenha apenas uma instância e fornece um ponto global de acesso a ela.

Quando usar:

  • Logger global
  • Gerenciador de configuração
  • Acesso a um banco de dados ou serviço centralizado

✅ Benefícios

  • Controle de instância única
  • Redução de overhead (principalmente com recursos caros)
  • Fácil acesso global (sem precisar passar como parâmetro)

❌ Desvantagens

  • Pode introduzir acoplamento global
  • Dificulta testes unitários (mockar singletons é mais complicado)
  • Pode esconder dependências reais do sistema

Exemplo de Singleton em C++ Moderno (thread-safe)

#include <iostream>
#include <mutex>

class Logger {
public:
    // Proíbe cópia e atribuição
    Logger(const Logger&) = delete;
    Logger& operator=(const Logger&) = delete;

    static Logger& getInstance() {
        static Logger instance;
        return instance;
    }

    void log(const std::string& message) {
        std::lock_guard<std::mutex> lock(mutex_);
        std::cout << "[LOG]: " << message << std::endl;
    }

private:
    Logger() {} // Construtor privado
    std::mutex mutex_;
};

int main() {
    Logger::getInstance().log("Iniciando aplicação...");
    Logger::getInstance().log("Carregando recursos...");
    return 0;
}

✨ Por que esse código é bom?

  • static local garante lazy initialization e thread-safety desde C++11.
  • O mutex protege chamadas simultâneas à função log.
  • Proíbe cópia e atribuição — essencial para garantir instância única.

Dica Profissional

Mesmo sendo útil, evite usar Singleton em todas as situações. Se você precisar compartilhar estado, avalie se um padrão como Dependency Injection ou Service Locator não seria melhor.


Assista ao vídeo

🔚 Conclusão

O Singleton é simples de entender, mas poderoso quando bem aplicado. É um ótimo ponto de partida para estudar outros padrões como Factory, Observer e Strategy.

Dominar esses padrões pode ser a diferença entre um programador mediano e um arquiteto de soluções respeitado no time.

Continue estudando, implementando e refatorando — porque é assim que se constrói uma carreira sólida na tecnologia. 💪

Se quiser, me avise que posso te mostrar os próximos padrões para aprender!