В некоторых моих кодах у меня есть статическая фабрика, похожая на эту:
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
and File
сложно тестировать по тем же причинам. Если у вас есть класс, например, который устанавливает Created
дату DateTime.Now
в конструкторе, как вы собираетесь создавать модульный тест с двумя из этих объектов, которые были созданы с интервалом в 5 минут? А как насчет лет? Вы действительно не можете сделать это (без большой работы).
private
конструктора и getInstance()
метода? Извините, неисправимая гнилька!