Я пытаюсь кратко описать , когда использовать factory, как для себя, так и для моей команды. Я столкнулся со следующими связанными вопросами, которые несколько помогли:
- Когда использовать factory шаблоны?
- (полезная pdf-ссылка не работает)
- Как вы создаете свои фабрики?
- (больше "как", а не "когда" )
- Каков ваш порог для использования factory вместо конструктора для создания объекта?
- (некоторые общие ответы)
- Factory Шаблон. Когда использовать методы factory?
- (больше о factory методах, чем классы factory)
- Когда использовать шаблон метода factory?
- (опять-таки о методах factory)
На основе этих ссылок и нескольких других источников (перечисленных внизу) я пришел к следующему:
Когда использовать абстрактный шаблон factory:
- когда вы используете интерфейс var или оператор 'new'
- например. Пользователь user = new ConcreteUserImpl();
- и код, который вы пишете, должен быть доступен для проверки/расширения в какой-то момент
Объяснение:
- по самой своей природе подразумевают множество реализаций (хорошо для модульного тестирования)
- интерфейс vars подразумевает код, совместимый с OCP- и LSP (поддержка подкласса)
- использование "нового" оператора прерывает OCP/DI, потому что высокосвязные классы трудно проверить или изменить.
"Я создаю factory для каждого типа объекта? Это кажется чрезмерным.
- нет, у вас может быть одна (или несколько) фабрик, которые производят множество (обычно связанных) типов объектов
- например. appFactory.createUser(); appFactory.createCatalog(); и т.д.
Если НЕ использовать factory:
- новый объект очень прост и вряд ли будет подклассифицирован
- например. Список списка = новый ArrayList();
- новый объект не интересен для тестирования
- не имеет зависимостей
- не выполняет релевантную или долговременную работу.
- например. Logger log = new SimpleLogger();
Литература:
- http://googletesting.blogspot.com/2008/08/where-have-all-singletons-gone.html
- http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/
- http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
- http://en.wikipedia.org/wiki/Dependency_Injection
- http://en.wikipedia.org/wiki/Open_Closed_Principle
- http://en.wikipedia.org/wiki/Liskov_substitution_principle
Мой вопрос: является ли мое резюме точным, и имеет ли он смысл? Есть ли что-то, что я забыл?
Спасибо заранее.