Связь паттерна синглтона с внедрением зависимостей - PullRequest
0 голосов
/ 08 февраля 2012

Отсюда: http://www.codingwithoutcomments.com/

Если вы используете Singletons, попробуйте использовать внедрение зависимостей вместо вызывая getInstance () из конструктора, используйте это:

public MyConstructor(Singleton singleton) 
{
     this.singleton = singleton; 
} 

вместо этого:

public MyConstructor() 
{
     this.singleton = Singleton.getInstance(); 
}

По крайней мере, использование внедрения зависимостей позволяет вам выполнить некоторое модульное тестирование класса, придерживаясь хороших принципов инкапсуляции.

Как это "внедрение зависимости"? Что означает внедрение зависимости?
Разве это не противоречит цели паттерна синглтона?

Предполагается, что это будет использоваться некоторое время, а затем будет удалено?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Как это "внедрение зависимости"?

«Внедрение зависимости» означает, что вы явно предоставляете объекту ссылки на все другие объекты, от которых он зависит; это то, что делает первый пример, когда передает ссылку на конструктор.

Альтернативой является неявное предоставление объектов, от которых оно зависит, путем предоставления им глобальной доступности. Вот что делает второй пример.

Основным преимуществом внедрения зависимости является то, что зависимость может быть в абстрактном интерфейсе; нет необходимости связывать ваш класс с конкретным конкретным классом или с конкретным экземпляром этого класса. Это делает тестирование более удобным - ваш класс можно тестировать изолированно, взаимодействуя с «тупыми» реализациями любого интерфейса, от которого он зависит. Это также облегчает отслеживание зависимостей, поскольку все они явно указаны в коде.

Основные преимущества использования глобальных переменных заключаются в том, что они позволяют писать немного меньше кода, и вам не нужно беспокоиться об управлении зависимостями, пока они не станут проблемой; когда они это сделают, вы можете просто отказаться от проекта и начать новый.

Не противоречит ли это цели паттерна синглтона?

Это скорее зависит от того, как вы думаете, какова цель анти-паттерна. Это, безусловно, устраняет удобство глобально доступного экземпляра; но, предполагая, что класс Singleton следует антипаттерну, у вас все еще есть уверенность в том, что объект, который вы получаете, - это Единый Истинный Экземпляр.

Предполагается, что это будет использоваться в течение некоторого времени, а затем будет удалено?

Синглтон должен быть заменен обычным классом, передаваемым по ссылке на его иждивенцы, как только вам нужно будет сделать то, что предотвращает анти-шаблон (модульное тестирование, множественные экземпляры, подтипы, абстрактный интерфейс и т. Д.). Нет необходимости удалять внедрение зависимостей, когда оно там есть; вам нужно будет вернуть его снова, как только вы обнаружите, что синглтоны не соответствуют вашим требованиям.

0 голосов
/ 08 февраля 2012

Нет различий в предоставленных вами кодах и в том, что это не внедрение зависимостей, потому что вы передаете синглтон по значению в конструктор (это конструктор, верно?).

Если у вас естьиспользовать singleton, а затем передать объект, которым он управляет, в конструктор, используя ссылку:

struct Abase
{
};
struct A : Abase // object of this type is created in the singleton
{
};

struct B
{
  B(Abase &a_) : a(a_)
  {
  }

private:
  Abase & a;
};

//...
B b( Singleton.getInstance() );
//...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...