In alcuni dei miei codici, ho una fabbrica statica simile a questa:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
Durante una revisione del codice, è stato proposto che questo dovrebbe essere un singleton e iniettato. Quindi dovrebbe assomigliare a questo:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
Alcune cose da evidenziare:
- Entrambe le fabbriche sono senza stato.
- L'unica differenza tra i metodi sono i loro ambiti (istanza vs statica). Le implementazioni sono le stesse.
- Foo è un bean che non ha un'interfaccia.
Gli argomenti che avevo per diventare statici erano:
- La classe è senza stato, quindi non ha bisogno di essere istanziata
- Sembra più naturale essere in grado di chiamare un metodo statico che dover istanziare uno stabilimento
Gli argomenti per la fabbrica come singleton erano:
- È bello iniettare tutto
- Nonostante l'apolidia della fabbrica, il test è più semplice con l'iniezione (facile da prendere in giro)
- Dovrebbe essere preso in giro durante il test del consumatore
Ho alcuni problemi seri con l'approccio Singleton dal momento che sembra suggerire che nessun metodo dovrebbe mai essere statico. Sembra anche suggerire che le utilità come StringUtils
debbano essere confezionate e iniettate, il che sembra sciocco. Infine, implica che a un certo punto dovrò prendere in giro la fabbrica, il che non sembra giusto. Non riesco a pensare a quando avrei bisogno di prendere in giro la fabbrica.
Che cosa pensa la comunità? Anche se non mi piace l'approccio singleton, non sembra che ci sia un argomento terribilmente strong contro di esso.