Ну, они не совсем сопоставимы.Вам всегда придется создавать новый объект, создавая экземпляр класса в какой-то момент.Внедрение зависимостей также требует создания новых объектов.
Внедрение зависимостей действительно вступает в игру, когда вы хотите контролировать или проверять поведение экземпляров, используемых классом, который вы используете или хотите протестировать.(Для Test Driven Development внедрение зависимостей является ключевым для всех, кроме самого маленького примера.)
Предположим, что класс Holder требует объект класса Handle.Традиционный способ сделать это - позволить экземпляру Holder создать и владеть им:
class Holder {
private Handle myHandle = new Handle();
public void handleIt() {
handle.handleIt();
}
}
Экземпляр Holder создает myHandle, и никто за пределами класса не может получить к нему доступ.В некоторых случаях, когда модульное тестирование является одним из них, это проблема, потому что невозможно протестировать класс Holder без создания экземпляра Handle, который, в свою очередь, может зависеть от многих других классов и экземпляров.Это делает тестирование громоздким и громоздким.
Путем внедрения экземпляра Handle, например, в конструктор, кто-то извне становится ответственным за создание экземпляра.
class Holder {
private Handle myHandle;
public Holder(Handle injectedHandle) {
myHandle = injectedHandle;
}
public void handleIt() {
handle.handleIt();
}
}
Как вы можетевидите, код почти такой же, а Handle все еще закрыт, но класс Holder теперь имеет гораздо более слабую связь с внешним миром, что упрощает многие вещи.И при тестировании класса Holder вместо реального экземпляра может быть введен фиктивный или тупиковый объект, позволяющий проверить или контролировать взаимодействие между Holder, его вызывающей стороной и дескриптором.
Фактическая инъекция будет иметь местов каком-то другом месте, обычно в какой-то «основной» программе.Существует множество фреймворков, которые могут помочь вам сделать это без программирования, но, по сути, это код «основной» программы:
...
private Handle myHandle = new Handle(); // Create the instance to inject
private Handler theHandler = new Handler(myHandle); // Inject the handle
...
По сути, внедрение - это не более чем причудливый set
метод.,И, конечно, вы можете реализовать механизм внедрения, используя его вместо конструктора, как в простом примере выше.