Pergunta

Ou é melhor usar outro padrão de design?

Foi útil?

Solução

respondeu a uma pergunta semelhante há alguns dias aqui, zombando um Singleton . O post original é para C # .Net, no que respeita zombando o comportamento de um singleton, mas ainda deve ser aplicada.

No que respeita ao padrão Singleton, não há nada de errado com ele, por si só - em muitos casos que queremos centralizar a lógica e dados. No entanto, há uma diferença muito grande entre um singleton e uma classe estática. Construindo o seu singleton como uma classe estática códigos rígidos que a implementação de cada consumidor em sua aplicação - o que torna unidade de teste muito difícil

O que você quer fazer é definir uma interface para o seu singleton, expondo os métodos para seus consumidores para uso. Seus consumidores, por sua vez são passou uma referência a uma classe que implementa por quem instancia-los [normalmente esta é a sua aplicação, ou um recipiente se você estiver familiarizado com Dependency Injection \ Inversão de Controle].

É neste quadro, quem é instanciar os consumidores, que é responsável por garantir uma e apenas uma instância está flutuando. Não é realmente tão grande de um salto de classe estática para referência interface [conforme demonstrado no link acima], que acabou de perder a conveniência de uma instância globalmente acessível - eu sei que eu sei, referências globais são terrivelmente sedutora, mas Luke virou as costas para o dark Side, você também pode!

De modo geral, as melhores práticas sugerem evitando referências estáticas, e incentiva a programação contra interfaces. Lembre-se, ainda é possível aplicar o padrão singleton com essas restrições. Siga essas orientações, e você deve ter nenhuma unidade problema testar o seu trabalho:)

Espero que isso ajude!


Singleton! = Classe public static , ao invés Singleton == instância única

Outras dicas

A falta de capacidade de teste é uma das maiores quedas do modelo clássico Singleton (método de classe estática que retornam uma instância). Tanto quanto eu estou preocupado, isso é justificação suficiente para re-projetar qualquer código que usa Singletons usar algum outro projeto.

Se você absolutamente necessário ter uma instância singular, em seguida, Dependency Injection e escrita para uma interface, como sugerido por g johnny, é definitivamente o caminho a percorrer.

Eu estou usando o seguinte padrão quando eu escrever uma singletons baseada estáticos que eu pode zombar. O código é Java, mas eu acho que você vai ter uma idéia. O principal problema com esta abordagem é que você tem para relaxar construtor para (que derrotas sorta um verdadeiro singleton) protegido por pacote. Como uma nota lateral - o código aplica-se a capacidade de zombar o seu código "estática" não necessariamente simplesmente chamá-lo

Eu geralmente só usar Singletons para objetos Flyweight ou objetos de valor semelhante. Olhando para um contêiner IoC (como discutido acima) é provavelmente a melhor maneira de lidar com um objeto compartilhado que um singleton.

Considere que em Smalltalk (onde um monte de esses padrões se originou), o verdadeiro eo falso foram efetivamente singletons:)

Se você deve usar um singleton (e há razões para o fazer ... mas eu sempre tentar evitá-lo se possível). Eu recomendaria usar um recipiente COI para gerenciá-lo. Im não tem certeza se há um para Delphi ou não. Mas, em Java você pode usar Spring, em .NET você pode usar Windsor / Castle. A IOC recipiente pode prender a Singleton e podem registar implementações diferentes para testar.

É provavelmente muito grande de um assunto para entrar aqui além deste trecho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top