8 votes

Est-ce que les Factories Abstraites utilisent "new" ?

Je cherche à utiliser autant que possible l'injection de dépendance, mais j'ai du mal quand il s'agit de dépendances de courte durée.

Par exemple, disons que j'ai un objet gestionnaire de blog qui souhaite générer une liste de blogs trouvés dans la base de données. Les options pour le faire (autant que je sache) sont les suivantes :

  1. new Blog();
  2. $this->loader->blog();
    • l'objet loader crée divers autres types d'objets comme des objets de base de données, des filtres de texte, etc.
  3. $this->blogEntryFactory->create();

Cependant, #1 est mauvais car cela crée un couplage fort. #2 semble toujours mauvais car cela signifie que l'usine d'objets doit être injectée au préalable - exposant ainsi tous les autres objets qu'elle peut créer.

Le numéro 3 semble correct, mais si j'utilise #3, dois-je mettre les mots-clés "new" dans la blogEntryFactory elle-même, OU, injecter le loader dans la blogEntryFactory et utiliser le loader ?

Si j'ai beaucoup de différentes usines comme blogEntryFactory (par exemple, je pourrais avoir userFactory et commentFactory), il semblerait que mettre le mot-clé "new" sur toutes ces différentes usines créerait des problèmes de dépendance.

J'espère que cela a du sens...

REMARQUE

J'ai eu quelques réponses disant que c'était inutile pour cet exemple de blog spécifique, mais il existe en fait des cas où vous devriez utiliser le modèle de fabrique abstraite, et c'est le point sur lequel je veux aller. Utilisez-vous "new" dans ce cas, ou faites-vous autre chose ?

4voto

Explosion Pills Points 89756

Je ne suis pas expert, mais je vais essayer de m'en sortir. Cela suppose que Blog est simplement un objet modèle de données qui sert de conteneur pour certaines données et qui est rempli par le contrôleur (new Blog n'a pas beaucoup de sens). Dans ce cas, Blog est une feuille du graphe d'objets, et l'utilisation de new est correcte. Si vous devez tester des méthodes qui nécessitent de créer un Blog, vous devez simultanément tester la création du Blog de toute façon, et utiliser un objet simulé n'a aucun sens... le Blog ne persiste pas au-delà de cette méthode.

Par exemple, supposons que PHP n'ait pas de constructeur de tableau mais qu'il dispose d'un objet collections. Appelleriez-vous $this->collectionsFactory->create() ou seriez-vous satisfait de dire new Array;?

0voto

jaco0646 Points 702

En réponse au titre : oui, les fabriques abstraites utilisent généralement new. Par exemple, consultez le code MazeFactory à la page 92 du livre GoF. Il inclut, return new Maze; return new Wall; return new Room; return new Door;

En réponse à la note : un design qui utilise des fabriques abstraites pour créer des modèles de données est très suspect. Le but est de faire varier le comportement des produits de la fabrique tout en rendant leurs implémentations concrètes invisibles pour les clients. Les modèles de données sans comportement ne bénéficient pas d'une fabrique abstraite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X