Domanda

Qual è il modo corretto di fornire valori a un metodo factory astratta?

Eg.

interface IFactory
{
  ISomething Create(int runTimeValue);
}

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

Nell'esempio repository viene iniettato tramite il costruttore quando si crea fabbrica ma potrebbe invece spostare il repository al iFactory interfaccia

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

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

Quello che è considerato modo "corretto" di fare questo? Come dovrebbe una ragione durante la progettazione di una fabbrica di astratto?

È stato utile?

Soluzione

modello Abstract Factory dovrebbe essere utilizzato nei casi in cui gli oggetti restituiti dalla necessità fabbrica per essere " inizializzato" in modo diverso, in modo che solo la fabbrica sa come farlo. Così diverse implementazioni di ISomething saranno "inizializzati" oppure creati in modo diverso e solo le loro rispettive implementazioni di fabbrica sanno come farlo.

Nel vostro caso bisogna chiedersi:

Do tutti implementazioni ISomethings bisogno del IRepository così come runtimeValue ?. In questo caso si può semplicemente utilizzare il modello di fabbrica.

Usa Abstract Factory in un tale scenario: (qualcosa e SomeOtherthing vengono creati in modo diverso)

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

Altri suggerimenti

Direi che essere coerente. Se il repository viene iniettato ovunque che è utilizzato, non avrebbe molto senso per iniettare nella costruzione della fabbrica, piuttosto che lo rende una parte dell'interfaccia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top