design di classe in base al modello di CIO e Abstract Factory
-
27-09-2019 - |
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?
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.