Sobes.tech
Junior

O que é o padrão de projeto Singleton?

sobes.tech IA

Resposta da IA

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

É usado quando é necessária uma única instância de um recurso, por exemplo:

  • Gestor de configuração
  • Pool de conexões à base de dados
  • Registador (logger)

Implementações:

  • Inicialização preguiçosa (Lazy Initialization): A instância é criada na primeira vez que é acessada.

    public sealed class Singleton
    {
        private static Singleton? instance = null;
        private static readonly object lockObject = new object();
    
        private Singleton() { } // Construtor privado
    
        public static Singleton Instance
        {
            get
            {
                // Verificação de null para evitar bloqueios na maioria dos casos
                if (instance == null)
                {
                    // Bloqueio para segurança de threads
                    lock (lockObject)
                    {
                        // Verificação dupla de null dentro do bloqueio
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    
  • Inicialização estática (Eager Initialization): A instância é criada ao carregar a classe.

    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();
    
        private Singleton() { } // Construtor privado
    
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }
    

    Vantagem: segurança de threads por padrão, implementação mais simples. Desvantagem: a instância é criada mesmo que não seja usada.

  • Usando Lazy<T>:.NET Framework fornece suporte embutido para inicialização preguiçosa.

    public sealed class Singleton
    {
        private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());
    
        private Singleton() { } // Construtor privado
    
        public static Singleton Instance
        {
            get
            {
                return lazyInstance.Value;
            }
        }
    }
    

    Vantagem: segurança de threads e inicialização preguiçosa pronta para uso, código mais limpo.

Vantagens do Singleton:

  • Controle sobre o número de instâncias.
  • Ponto de acesso global.
  • Inicialização preguiçosa (em algumas implementações).

Desvantagens do Singleton:

  • Pode violar o princípio de responsabilidade única.
  • Dificulta testes unitários.
  • Pode levar a uma forte dependência do código.