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 StringUtilsdevem 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.
DateTimee Filesão notoriamente difíceis de testar pelas mesmas razões. Se você tem uma classe, por exemplo, que define a Createddata DateTime.Nowno 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).
privateconstrutor e um getInstance()método? Desculpe, nit-picker incorrigível!