У деяких кодах у мене є статична фабрика, подібна до цієї:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
Під час огляду коду було запропоновано, щоб це було однократним та ін'єкційним. Отже, це має виглядати приблизно так:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
Кілька речей, які слід виділити:
- Обидва заводи без громадянства.
- Єдина відмінність між методами - їх сфери застосування (екземпляр проти статичних). Реалізації однакові.
- Foo - боб, який не має інтерфейсу.
Аргументи, які я мав стати статичними, були:
- Клас без громадянства, тому його не потрібно обґрунтовувати
- Здається, більш природним є можливість викликати статичний метод, ніж інстанціювати завод
Аргументами для фабрики як сингтона були:
- Добре все вводити
- Незважаючи на стан без громадянства на заводі, тестування простіше за допомогою ін'єкцій (легко глузувати)
- Слід знущатися над тестуванням споживача
У мене є декілька серйозних проблем із синглтонним підходом, оскільки, здається, це говорить про те, що жоден метод не повинен стати статичним. Здається, це дозволяє припустити, що такі утиліти, як StringUtils
слід, загортати та вводити, що здається нерозумним. Нарешті, це означає, що мені потрібно буде знущатися над заводом у якийсь момент, що не здається правильним. Я не можу придумати, коли мені потрібно знущатися над заводом.
Що думає громада? Хоча мені не подобається одинаковий підхід, я, здається, не маю надзвичайно сильних аргументів проти цього.
DateTime
та File
класах, як відомо, важко перевірити саме з тих же причин. Якщо у вас є, наприклад, клас, який задає Created
дату DateTime.Now
в конструкторі, як ви збираєтеся створити одиничний тест з двома з цих об'єктів, створених за 5 хвилин один від одного? Що про роки нарізно? Ви дійсно не можете цього зробити (без великої роботи).
private
конструктор і getInstance()
метод? Вибачте, незмінний збирач азоту!