O que é o Singleton?

O Singleton é um dos vinte e três design patterns conhecidos do “Gang of Four” que descrevem como resolver problemas recorrentes de projetos de softwares orientados a objeto flexíveis e reutilizáveis. O objetivo é fazer com que os objetos fiquem mais fáceis implementar, alterar, testar e reutilizar.

O Singleton garante com que a classe tenha apenas uma instância e forneça uma única fonte de acesso global as suas propriedades e valores.

Quando se utiliza?

O Singleton pode ser usado quando é necessário resolver esses problemas:

  • Deve haver somente uma instância da classe e deve ser acessível aos clientes de um ponto de acesso comum;
  • Quando a única instância deve ser extensível por subclasse e os clientes devem ser capazes de usar uma instância estendida sem modificar seu código;
  • Esconda o construtor da classe;
  • Definir uma operação estática pública (GetInstance()) que retorna a única instância da classe;
  • A ideia central deste padrão é fazer com que ele mesmo seja responsável por controlar sua instanciação (que é instanciada apenas uma vez);
  • Ocultar o construtor da classe para garantir que mesma nunca possa ser instanciada de fora dela;
  • A operação estática pública pode ser acessada facilmente usando o nome da classe e o nome da operação (Singleton.GetInstance()).

Código

Vamos criar duas classes, uma GuidComum (que armazenará um Guid da forma tradicional) e um GuidSingleton (que usará o design pattern Singleton).

GuidComum.cs

public class GuidComum
    {
        private Guid instance;

        public Guid Instance
        {
            get
            {
                if (instance == Guid.Empty)
                {
                    instance = Guid.NewGuid();
                }

                return instance;
            }
        }
    }

GuidSingleton.cs

public class GuidSingleton
    {
        private static Guid instance;

        private GuidSingleton() { }

        public static Guid Instance
        {
            get
            {
                if (instance == Guid.Empty)
                {
                    instance = Guid.NewGuid();
                }

                return instance;
            }
        }
    }

Depois de criado, é só chamarmos na controller e exibir na tela os resultados:

Repare que temos dois comportamentos aí. O primeiro Guid é o Comum, que cria uma nova instância a cada vez que é chamado. O segundo é o Singleton, este cria somente uma instância e a utiliza para o projeto todo. Não importa quantas vezes chamamos a página, o Singleton não vai mudar e, se mudar, mudará para todo o sistema.

Conclusão

O pattern Singleton pode ser usado em diversas situações, é excelente para controlar variáveis globais ou garantir que todos estão utilizando o mesmo objeto, porém, deve-se ficar muito atento pois não se esqueça de que uma vez o seu valor alterado todos os que estão utilizando vão notar esta mudança.

Os códigos deste artigo podem ser encontrados no meu GitHub