Em alguns dos meus códigos, tenho uma fábrica estática semelhante a esta:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
Durante uma revisão de código, foi proposto que este fosse um singleton e injetado. Portanto, deve ficar assim:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
Algumas coisas a destacar:
- Ambas as fábricas são apátridas.
- A única diferença entre os métodos são seus escopos (instância vs estática). As implementações são as mesmas.
- Foo é um bean que não possui uma interface.
Os argumentos que tive para ficar estático foram:
- A classe é sem estado, portanto, não precisa ser instanciada
- Parece mais natural poder chamar um método estático do que ter que instanciar uma fábrica
Os argumentos para a fábrica como um singleton foram:
- É bom injetar tudo
- Apesar da apatridia da fábrica, o teste é mais fácil com a injeção (fácil de zombar)
- Deve ser ridicularizado ao testar o consumidor
Eu tenho alguns problemas sérios com a abordagem singleton, pois parece sugerir que nenhum método deve ser estático. Também parece sugerir que utilitários como StringUtils
devem ser embalados e injetados, o que parece bobagem. Por fim, isso implica que vou precisar zombar da fábrica em algum momento, o que não parece certo. Não consigo pensar em quando precisaria zombar da fábrica.
O que a comunidade pensa? Embora eu não goste da abordagem singleton, não pareço ter um argumento muito forte contra isso.
DateTime
e File
são notoriamente difíceis de testar pelas mesmas razões. Se você tem uma classe, por exemplo, que define a Created
data DateTime.Now
no construtor, como criar um teste de unidade com dois desses objetos que foram criados com 5 minutos de intervalo? E quanto a anos separados? Você realmente não pode fazer isso (sem muito trabalho).
private
construtor e um getInstance()
método? Desculpe, nit-picker incorrigível!