Singleton
Definição
O Padrão Singleton garante que uma classe tenha apenas uma instância durante a execução do programa, e fornece um ponto de acesso centralizado e controlado a ela.
Esse padrão é útil quando apenas uma instância de uma classe deve existir — como no caso de gerenciadores de configuração, conexões globais, registradores de log ou cache compartilhado.
Por que é importante
Evita a criação descontrolada de múltiplas instâncias de classes que devem ser únicas, economizando recursos e mantendo a consistência global.
Também permite acesso centralizado à instância e controle de seu ciclo de vida, o que é útil em situações onde o compartilhamento de estado é necessário.
Exemplo prático (Python)
Abaixo, um exemplo do padrão Singleton implementado com uma metaclasse. Esse padrão garante que apenas uma instância da classe seja criada — mesmo que ela seja chamada várias vezes.
Neste exemplo, a classe Logger
representa um serviço de log
do sistema, responsável por registrar mensagens de depuração, erro ou
informação. Em aplicações reais, loggers costumam ser Singletons para
garantir que toda a aplicação compartilhe o mesmo mecanismo de registro —
evitando múltiplas instâncias desnecessárias e centralizando a saída dos
logs.
# Metaclasse que controla a criação de instâncias
class SingletonMeta(type):
_instancias = {} # Armazena instâncias únicas por classe
def __call__(cls, *args, **kwargs):
if cls not in cls._instancias:
# Cria a instância se ainda não existir
cls._instancias[cls] = super().__call__(*args, **kwargs)
return cls._instancias[cls]
# Classe usando a metaclasse SingletonMeta
class Logger(metaclass=SingletonMeta):
def escrever(self, mensagem):
print(f"[LOG]: {mensagem}")
# Uso
log1 = Logger()
log2 = Logger()
print(log1 is log2) # True — ambas são a mesma instância
log1.escrever("Primeira mensagem")
Neste exemplo, a metaclasse SingletonMeta
intercepta a
criação da classe Logger
e garante que só exista uma
instância dela. Mesmo criando log1
e log2
, ambas
compartilham o mesmo objeto.