In einigen meiner Codes habe ich eine statische Factory, die der folgenden ähnelt:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
Während einer Codeüberprüfung wurde vorgeschlagen, dass dies ein Singleton sein und injiziert werden sollte. Also sollte es so aussehen:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
Einige hervorzuhebende Punkte:
- Beide Fabriken sind staatenlos.
- Der einzige Unterschied zwischen den Methoden besteht in ihren Gültigkeitsbereichen (Instanz vs. statisch). Die Implementierungen sind die gleichen.
- Foo ist eine Bohne ohne Schnittstelle.
Die Argumente, die ich hatte, um statisch zu werden, waren:
- Die Klasse ist zustandslos und muss daher nicht instanziiert werden
- Es erscheint natürlicher, eine statische Methode aufrufen zu können, als eine Factory instanziieren zu müssen
Die Argumente für die Fabrik als Singleton waren:
- Es ist gut, alles zu spritzen
- Trotz der Zustandslosigkeit der Fabrik ist das Testen mit der Injektion einfacher (leicht zu verspotten)
- Es sollte beim Testen des Verbrauchers verspottet werden
Ich habe einige schwerwiegende Probleme mit dem Singleton-Ansatz, da er darauf hindeutet, dass keine Methode jemals statisch sein sollte. Es scheint auch nahezulegen, dass Dienstprogramme wie StringUtils
verpackt und injiziert werden sollten, was albern erscheint. Schließlich impliziert dies, dass ich die Fabrik irgendwann verspotten muss, was nicht richtig zu sein scheint. Ich kann mir nicht vorstellen, wann ich die Fabrik verspotten muss.
Was denkt die Community? Obwohl mir der Singleton-Ansatz nicht gefällt, habe ich anscheinend kein besonders starkes Argument dagegen.
DateTime
und File
aus genau den gleichen Gründen bekanntermaßen schwer zu testen. Wenn Sie beispielsweise eine Klasse haben, die das Created
Datum DateTime.Now
im Konstruktor festlegt, wie erstellen Sie dann einen Komponententest mit zwei dieser Objekte, die im Abstand von 5 Minuten erstellt wurden? Was ist mit Jahren auseinander? Das kann man wirklich nicht (ohne viel Arbeit).
private
Konstruktor und eine getInstance()
Methode haben? Entschuldigung, unverbesserlicher Trottel!