Дизайн класса по схеме IoC и Abstract Factory - PullRequest
0 голосов
/ 10 августа 2010

Как правильно указать значения для метода абстрактной фабрики?

Например.

interface IFactory
{
  ISomething Create(int runTimeValue);
}

class Factory : IFactory
{
  public ISomething Create(int runTimeValue)
  {
    return new Something(repository, runTimeValue);
  }
}

В этом примере хранилище внедряется через конструктор при создании фабрики, но я мог бы вместо этого переместить хранилище в интерфейс IFactory

interface IFactory
{
  ISomething Create(IRepository repository, int runTimeValue);
}

class Factory : IFactory
{
  public ISomething Create(IRepository repository, int runTimeValue)
  {
    return new Something(repository, runTimeValue);
  }
}

Что считается «правильным» способом сделать это? Какую причину следует при проектировании абстрактной фабрики?

Ответы [ 2 ]

0 голосов
/ 10 августа 2010

Я бы сказал, быть последовательным. Если ваш репозиторий внедряется везде, где он используется, имеет смысл внедрить его в конструктор фабрики, а не делать его частью интерфейса.

0 голосов
/ 10 августа 2010

Абстрактный шаблон фабрики следует использовать в тех случаях, когда объекты, возвращаемые фабрикой, необходимо «инициализировать» по-разному таким образом, что только фабрика знает, как это сделать.Поэтому разные реализации ISomething будут «инициализированы» или созданы по-разному, и только их соответствующие реализации Factory знают, как это сделать.

В вашем случае вы должны спросить себя:

Do все реализации ISomethings нуждаются в IRepository, а также в runtimeValue ?.В этом случае вы можете просто использовать фабричный шаблон.

Используйте Abstract Factory в таком сценарии: (Нечто и Нечто создается по-разному)

interface IFactory {
  ISomething Create(int runTimeValue);
}

class Factory : IFactory {
  public ISomething Create(int runTimeValue)  {
    return new Something(repository, runTimeValue);
  }
}

class OFactory : IFactory {
  public ISomething Create(int runTimeValue) {
    // constructor takes different parameters
    SomeOtherthing thing = new SomeOtherthing("someValue", runtimeValue);
    thing.SetCustomRepository(new OtherRepositoryImpl());
    return thing;
  }
}
...