O Singleton é um padrão de projeto criacional, que garante que apenas um objeto desse tipo exista e forneça um único ponto de acesso a ele para qualquer outro código.
O Singleton tem quase os mesmos prós e contras que as variáveis globais. Embora sejam super úteis, eles quebram a modularidade do seu código.
Você pode usar classes que dependem de singletons em algumas outras situações. Você terá que levar a classe singleton também. Na maioria das vezes, essa limitação surge durante a criação de testes de unidade.
Identificação: O Singleton pode ser reconhecido por um método de criação estático, que retorna o mesmo objeto em cache.
Singleton ingênuo (thread única)
É muito fácil implementar um Singleton desleixado. Você só precisa ocultar o construtor e implementar um método de criação estático.
Singleton.java: Singleton
DemoSingleThread.java: Código cliente
OutputDemoSingleThread.txt: Resultados da execução
Singleton ingênuo (multithreaded)
A mesma classe se comporta incorretamente em um ambiente multithread. Vários threads podem chamar o método de criação simultaneamente e obter várias instâncias da classe Singleton.
Singleton.java: Singleton
DemoMultiThread.java: Client code
OutputDemoMultiThread.txt: Resultados da execuçãos
Singleton seguro para threads com carregamento lento
Para corrigir o problema, você deve sincronizar os threads durante a primeira criação do objeto Singleton.
Singleton.java: Singleton
DemoMultiThread.java: Client code
OutputDemoMultiThread.txt: Resultados da execuçãos
Quer mais?
Existem ainda mais sabores especiais do padrão Singleton em Java. Dê uma olhada neste artigo para descobrir mais: