Question

Quelle est la bonne façon de fournir des valeurs à une méthode de fabrication abstraite?

Par exemple.

interface IFactory
{
  ISomething Create(int runTimeValue);
}

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

Dans l'exemple, le dépôt est injecté par le constructeur lorsque l'usine est créé, mais je pouvais déplacer à la place du dépôt à l'interface IFactory

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

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

Qu'est-ce que est considéré comme « bonne » de le faire? Comment doit-on raison lors de la conception d'une usine abstraite?

Était-ce utile?

La solution

motif Fabrique Abstraite doit être utilisé dans les cas où les objets retournés par la nécessité de l'usine d'être " initialisé » différemment de telle sorte que seule l'usine sait comment le faire. mises en œuvre si différents de ISomething seront « initialisées » ou créés différemment et que leurs implémentations d'usine respectifs savent comment le faire.

Dans votre cas, vous devez vous demander:

Do tous implémentations de ISomethings besoin du IRepository ainsi que runtimeValue ?. Dans ce cas, vous pouvez simplement utiliser le modèle d'usine.

Utiliser Résumé usine dans le scénario d'un tel: (Quelque chose et SomeOtherthing sont créés différemment)

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;
  }
}

Autres conseils

Je dirais être cohérent. Si votre dépôt est injecté partout ailleurs qu'il est utilisé, il serait logique de l'injecter dans le constructeur de l'usine plutôt que de faire une partie de l'interface.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top