W niektórych moich kodach mam statyczną fabrykę podobną do tej:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
Podczas przeglądu kodu zaproponowano, aby był to singleton i został wstrzyknięty. Powinno to wyglądać tak:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
Kilka rzeczy do podkreślenia:
- Obie fabryki są bezpaństwowcami.
- Jedyną różnicą między metodami są ich zakresy (instancja vs. statyczność). Wdrożenia są takie same.
- Foo to fasola, która nie ma interfejsu.
Argumenty, które poparłem, aby stać się statyczne to:
- Klasa jest bezstanowa, dlatego nie trzeba jej tworzyć
- Wydaje się bardziej naturalne, że można wywołać metodę statyczną niż tworzyć instancję fabryki
Argumenty przemawiające za fabryką jako singletonem były:
- Dobrze jest wstrzykiwać wszystko
- Pomimo bezpaństwowości fabryki testowanie jest łatwiejsze dzięki iniekcji (łatwe do wyśmiewania)
- Należy wyśmiewać go podczas testowania konsumenta
Mam kilka poważnych problemów z podejściem singleton, ponieważ wydaje się sugerować, że żadna metoda nigdy nie powinna być statyczna. Wydaje się również sugerować, że narzędzia takie jak StringUtils
powinny być pakowane i wstrzykiwane, co wydaje się głupie. Wreszcie oznacza to, że w pewnym momencie będę musiał kpić z fabryki, co nie wydaje się właściwe. Nie mogę wymyślić, kiedy będę musiał kpić z fabryki.
Co myśli społeczność? Chociaż nie podoba mi się podejście singleton, nie wydaje mi się, aby miałam przeciwko temu strasznie silny argument.
DateTime
i File
są niezwykle trudne do przetestowania z dokładnie tych samych powodów. Jeśli masz na przykład klasę, która ustawia Created
datę DateTime.Now
w konstruktorze, jak przejść do tworzenia testu jednostkowego z dwoma z tych obiektów, które zostały utworzone w odstępie 5 minut? Co powiesz na lata? Naprawdę nie możesz tego zrobić (bez dużo pracy).
private
konstruktora i getInstance()
metody? Przepraszamy, niepoprawny próbnik nitów!