Чем в основном отличается внедрение зависимости от шаблона Factory Design?
Не могли бы вы вкратце объяснить: чем в основном отличается внедрение зависимостей от паттерна Factory Design?
Дополнительно: возможно ли продемонстрировать разницу очень просто на примере кода?
Спасибо
3 ответа
С фабрикой (или любым другим шаблоном создания) вызывающий должен знать, как получить объект, и должен "явно" запросить его, прежде чем использовать его.
Car car = CarFactory.getCarByModel(LUXURY);
Принимая во внимание, что при использовании DI ответственность за передачу нужного объекта делегируется некоторому внешнему (в основном контейнеру) объекту, который знает, как создать объект (путем чтения уже определенной конфигурации) и сделать его доступным для вызывающей стороны в режиме без вывода сообщений.
Car car = getCar();
void setCar(Car car){..} // container sets the car fromoutside
Заводской шаблон обычно полезен для многократного создания экземпляров объекта с возможно сложной логикой создания экземпляров. Таким образом, ваши классы знают о фабрике и запрашивают экземпляры.
Внедрение зависимостей делает еще один шаг вперед, чтобы полностью абстрагировать логику реализации в отношении ваших классов. Весь ваш код должен заботиться о том, чтобы объявить необходимые ему зависимости, не заботясь о том, откуда они берутся.
Хорошее подробное руководство смотрите в разделе Инверсия управляющих контейнеров и шаблон внедрения зависимостей.
С обоими шаблонами достигаются одинаковые цели, просто с помощью шаблона проектирования фабрики вы должны писать код, в то время как с DI вы используете существующую структуру DI, чтобы выполнить работу за вас и просто выполнить настройку зависимостей. С шаблоном фабрики вы должны написать фабрики для ваших классов.