Na maioria das linguagens de programação, as classes fogem muito do sistema de tipos. Embora uma classe, com seus métodos e variáveis estáticos, seja um objeto, muitas vezes ela não pode implementar uma interface ou estender outras classes. Por esse motivo, não pode ser usado de forma polimórfica, pois não pode ser o subtipo de outro tipo. Por exemplo, se você tiver uma interface IFooable
, que é exigida por várias assinaturas de método de outras classes, o objeto de classe StaticFoo
não pode ser usado no lugar de IFooable
, ao passo que FooSingleton.getInstance()
pode (assumindo, FooSingleton
implementa IFooable
).
Observe que, como comentei na resposta de Heinzi, um singleton é um padrão para controlar a instanciação. Ele substitui new Class()
por Class.getInstance()
, o que dá ao autor Class
mais controle sobre as instâncias, que ele pode usar para evitar a criação de instâncias desnecessárias. O singleton é apenas um caso muito especial do padrão de fábrica e deve ser tratado como tal. O uso comum torna-o mais o caso especial de registros globais, que muitas vezes acabam mal, porque os registros globais não devem ser usados à toa.
Se você planeja fornecer funções auxiliares globais, os métodos estáticos funcionarão bem. A classe não atuará como classe, mas apenas como um namespace. Eu sugiro que você preserve a alta coesão ou pode acabar com os problemas de acoplamento mais estranhos.
greetz
back2dos