web-dev-qa-db-fra.com

Modèle d'usine et / ou injection de dépendance?

Je comprends le concept et je peux utiliser à la fois le modèle d'usine et l'injection de dépendance, mais ils semblent un peu en contradiction conceptuelle. S'agit-il d'utiliser l'un sur l'autre? Ou peuvent-ils être utilisés conjointement?

Si vous utilisez DI, coderiez-vous en dur la création de classes dans une usine? Cela n'irait-il pas à l'encontre du but de DI? Comme l'usine dépend de l'existence des classes qu'elle crée, elle devrait donc être transmise à l'usine lors de l'exécution lors de l'utilisation de DI.

Ou passeriez-vous les classes que l'usine est censée créer à l'usine est censée créer? Si c'est le cas, cela ne viderait-il pas la construction d'une usine en premier lieu? Comme l'injecteur ferait essentiellement tout le travail de l'usine.

Merci beaucoup pour votre attention, je me réjouis de vos idées.

12

Si vous utilisez DI, coderiez-vous en dur la création de classes dans une usine? Cela n'irait-il pas à l'encontre du but de DI?

Non, cela ne viole pas le principe d'inversion de dépendance (pas d'injection) car le but de l'usine est de créer pour nous un objet concret.

Ou passeriez-vous les classes que l'usine est censée créer à l'usine est censée créer? Si c'est le cas, cela ne viderait-il pas la construction d'une usine en premier lieu? Comme l'injecteur ferait essentiellement tout le travail de l'usine.

Tu as raison!

Les modèles d'usine sont les modèles de création - ils sont responsables de la création d'instances.

Les modèles d'injection de dépendance concernent le couplage lâche et l'inversion de dépendance (inversion de contrôle) - ils injectent des instances dont une autre instance a besoin pour faire son travail.

Ils abordent différents problèmes et peuvent être utilisés conjointement. Un exemple (peut-être pas génial mais j'espère que cela fera l'affaire):

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

Utilisez des modèles d'injection de dépendance pour introduire un couplage desserré.

Utilisez Factory Patterns si vous devez déléguer la création d'objets.

6
Pellared

Lorsque vous faites un usage intensif de l'injection de dépendances, vous séparez votre code en parties avec des classes/objets contenant des fonctionnalités et des fonctions, et du code où la création de la première a lieu et où les dépendances sont résolues. Ce dernier peut être effectué soit par

  • un conteneur DI
  • Classes d'usine

Donc DI n'est pas contraire à l'utilisation des usines, en fait, lorsque vous faites DI sans conteneur DI, vous aurez généralement besoin de nombreuses usines.

Voir ceci article de blog pour une explication plus complète.

8
Doc Brown