С фабрикой (или любым другим шаблоном создания) вызывающий должен знать, как получить объект, и должен «явно» запрашивать его перед его потреблением.
Car car = CarFactory.getCarByModel(LUXURY);
В то время как при использовании DI,ответственность за передачу нужного объекта делегируется некоторому внешнему (в основном контейнеру) объекту, который знает, как создать объект (путем чтения уже определенной конфигурации) и сделать его доступным для вызывающего абонента без вывода сообщений.
Car car = getCar();
void setCar(Car car){..} // container sets the car fromoutside