Pattern di fabbrica e / o iniezione di dipendenza? [duplicare]

9

Comprendo il concetto e posso usare sia il modello di fabbrica che l'iniezione di dipendenza, tuttavia sembrano concettualmente in contrasto l'uno con l'altro. Si tratta di utilizzare l'uno sull'altro? Oppure possono essere usati insieme l'uno con l'altro?

Se si usa DI si codificherà strongmente la creazione di classi all'interno di una fabbrica? Non sarebbe questo a sconfiggere il punto di DI? Dato che la factory dipende dall'esistenza delle classi create, e quindi dovrebbe averle passate alla factory in fase di esecuzione quando si utilizza DI.

O vorresti passare le classi che la fabbrica è destinata a creare per la fabbrica è destinata a creare? Se così fosse, non sarebbe in grado di sconfiggere il punto di costruzione di una fabbrica? Dato che l'iniettore avrebbe praticamente fatto tutto il lavoro della fabbrica.

Grazie mille per la vostra attenzione, non vedo l'ora di approfondire.

    
posta Samuel Hawksby-Robinson 07.12.2013 - 22:27
fonte

2 risposte

6

If using DI would you hard code the creation of classes within a Factory? Wouldn't this defeat the point of DI?

No, non viola il Principio di Inversione di Dipendenza (non Iniezione) perché è lo scopo della fabbrica è quello di creare per noi qualche oggetto concreto.

Or would you pass the classes that the factory is meant to create to the factory is meant to create? If so wouldn't that defeat the point of building a factory in the first place? As the Injector would basically be doing all the work of the factory.

Hai ragione!

I pattern di fabbrica sono gli schemi di creazione: sono responsabili della creazione delle istanze.

Gli schemi di iniezione delle dipendenze riguardano l'accoppiamento lento e l'inversione di dipendenza (Inversion of Control) - iniettano le istanze in cui un'altra istanza deve svolgere il proprio lavoro.

Affrontano diversi problemi e possono essere usati insieme. Un esempio (forse non un granché, ma spero che faccia il lavoro):

class Player {
    string name;
}

interface PlayerFactory {
    Person create();
}

class RealPlayerFactory : PlayerFactory {
    return GetPlayerFromDatabase();
}

class RandomPlayerFactory : PlayerFactory {
    Person result = new Person();
    result.name = GenerateRandomName();
    return result;
}

class Team {
    Team(PlayerFactory playerFactory) {
        for (int i=0; i < 11; ++i) {
            AddPlayer( playerFactory.create() );
        }
    }
}

Utilizza i modelli di iniezione delle dipendenze per introdurre un accoppiamento lento.

Usa modelli di fabbrica se è necessario delegare la creazione di oggetti.

    
risposta data 07.12.2013 - 23:31
fonte
8

Quando usi pesantemente l'iniezione di dipendenza, separi il tuo codice in parti con classi / oggetti che contengono caratteristiche e amp; funzioni e codice in cui avviene la creazione del primo e le dipendenze vengono risolte. Quest'ultimo può essere fatto da

  • un contenitore DI
  • Classi di fabbrica

Quindi, DI non è contrario all'uso delle Fabbriche, infatti, quando si esegue DI senza un contenitore DI, tipicamente è necessario un sacco di fabbriche.

Vedi questo post del blog per una spiegazione più completa.

    
risposta data 08.12.2013 - 09:37
fonte