Singleton
Singleton é um design pattern (padrão de projeto) que tem o objetivo garantir que existe apenas uma instancia de uma certa classe a qualquer instante e em qualquer ponto de um sistema.
A palavra " singleton " é usada também, de forma errada, para referir um objecto de um classe que apenas é instanciada uma vez no sistema. Este conceito não representa um verdadeiro singleton. Para clarificar considere as classes java.awt.Desktop e java.util.Currency . Nenhuma das duas tem um construtor público. Para obtermos um objeto Desktop temos que usar Desktop.getDesktop () e Currency.getInstance (). Ambos métodos estáticos. A diferença é que podemos ter vários objectos currency (um para cada moeda) mas não vários Desktop.
Então como saber se determinada classe é um singleton?
Simplemente obtenha várias vezes a instancia e compare com as anteriores usando = =. A classe não é singleton se existir pelo menos uma forma de comparar dois objectos a e b tal que a = = b é falso.
Um singleton é um objeto e como tal é o encapsulamento de dados e comportamento. Não é possivel substituir singleton por nenhum outro padrão de projeto. Mas talvez você não esteja precisando de um objeto único e sim de uma forma global de acessar a ele ou uma forma de garantir que só é instanciado uma única vez.
Se o seu objetivo é ter uma forma global de acesso considere usar o padrão Registry. Ele provê métodos estáticos para fazer set / get de variáveis globais O exemplo classico de um classe que implementa Registry é a classe System do JSE.
Se o seu objetivo é criar um objeto e uma forma de o instanciar apenas um vez, para poupar recursos, por exemplo, o padrão singleton não o vai ajudar. Nesse caso você irá usar o padrão Factory. Este é o padrão seguido pelo objeto Currency. Você pode ainda usar um container de inversão de dependencia como o Spring que já implementa o padrão Factory com controlo de numero de instancias de forma genérica.
Moral da historia? Pense muito bem no