Как это "внедрение зависимости"?
«Внедрение зависимости» означает, что вы явно предоставляете объекту ссылки на все другие объекты, от которых он зависит; это то, что делает первый пример, когда передает ссылку на конструктор.
Альтернативой является неявное предоставление объектов, от которых оно зависит, путем предоставления им глобальной доступности. Вот что делает второй пример.
Основным преимуществом внедрения зависимости является то, что зависимость может быть в абстрактном интерфейсе; нет необходимости связывать ваш класс с конкретным конкретным классом или с конкретным экземпляром этого класса. Это делает тестирование более удобным - ваш класс можно тестировать изолированно, взаимодействуя с «тупыми» реализациями любого интерфейса, от которого он зависит. Это также облегчает отслеживание зависимостей, поскольку все они явно указаны в коде.
Основные преимущества использования глобальных переменных заключаются в том, что они позволяют писать немного меньше кода, и вам не нужно беспокоиться об управлении зависимостями, пока они не станут проблемой; когда они это сделают, вы можете просто отказаться от проекта и начать новый.
Не противоречит ли это цели паттерна синглтона?
Это скорее зависит от того, как вы думаете, какова цель анти-паттерна. Это, безусловно, устраняет удобство глобально доступного экземпляра; но, предполагая, что класс Singleton следует антипаттерну, у вас все еще есть уверенность в том, что объект, который вы получаете, - это Единый Истинный Экземпляр.
Предполагается, что это будет использоваться в течение некоторого времени, а затем будет удалено?
Синглтон должен быть заменен обычным классом, передаваемым по ссылке на его иждивенцы, как только вам нужно будет сделать то, что предотвращает анти-шаблон (модульное тестирование, множественные экземпляры, подтипы, абстрактный интерфейс и т. Д.). Нет необходимости удалять внедрение зависимостей, когда оно там есть; вам нужно будет вернуть его снова, как только вы обнаружите, что синглтоны не соответствуют вашим требованиям.