Use algum container de injecao de dependencias, como PicoContainer, Spring, HiveMind, Avalon, etc etc etc, ao inves de criar Factories. Eh mais facil, simples, rapido e testavel. E nao provoca caries, de quebra
Singleton é para garantir a existencia de somente uma instancia da classe. Achar 1 use-case onde isso é um requisito é realmente raro, nos outros casos vc está usando o anti-pattern “gambiarra lookup”.
Uma factory é interessante não ser um singleton por vários motivos, vou dar um exemplo concreto para não parecer pura retórica.
Se a sua factory não for um singleton, refatorar seu código para instroduzir o pattern de abstract factory fica muito mais facil, do trivial para o infernal eu diria.
Singletons não escalam bem porque são dificeis de controlar quando se põe a aplicação em cluster;
Com EJBs é dificil usar Singletons por vários motivos como as restrições das variáveis estáticas read/write e também por race conditions. Singletons não podem ser synchronized com EJBs e todos os EJBs no mesmo container vão compartilhar a mesma instância. Não há como controlar o acesso concorrente. A alternativa de usar RMI para criar Singletons como objetos remotos é complicado e como não são gerenciados pelo EJB container, podem virar um single point of failure.
Singletons são inimigos mortais da testabilidade pois é muito dificil substituir um Singleton por um test stub
Singletons não deixam facilidades do tipo hot redeploy funcionar corretamente por permanecem com objetos no cache bloqueando mudanças na configuração.
Em tempos de uso de containers IoC, Singletons de qualquer tipo ficam completamente por fora das vantagens de uso de IoC
Além de se poder usar cluster há diversas outras vantagens de se evitar Singletons usando um um objeto de contexto de aplicação tipo ServletContext ou registry :
:arrow: Flexibilidade de projeto programando por interfaces e sem depender muito de variáveis estáticas;
:arrow: Os “Singletons” podem ser JavaBeans configurados pelas propriedades dos beans;
:arrow: Podemos recarregar os valores do “Singleton” inclusive com JMX
:arrow: Podemos ter um ponto único de configuração ao invés de um para cada Singleton.
Resumindo: não é que Singletons nunca devam ser usados como bem disse o louds. O problema é que a partir do momento em que usamos nossa aplicação perde escalabilidade e versatilidade.
CV, veja o que acabei de dizer neste instante para o rafael:[list]“realmente o louds e o cv há tempos atrás me chamaram a atenção para os riscos de se abusar de singletons.
Hoje vejo que eles tinham razão”[/list]
[]s
Luca