500 votes

Quelle est la différence fondamentale entre les patrons de conception Factory et Abstract Factory ?

Quelle est la différence fondamentale entre les patrons Factory et Abstract Factory ?

12 votes

A mon avis, la qualité des réponses dans Différences entre le modèle de fabrique abstraite et la méthode Factory sont bien meilleures que celles d'ici.

1 votes

La différence essentielle est que la méthode Factory utilise l'héritage (l'indirection est verticale, par exemple. createThing() ) et Abstract Factory utilise la composition (l'indirection est horizontale, par ex. getFactory().createThing() )

1 votes

Cette question n'est pas ce que certains de ses répondants pensent qu'elle est. Ne manquez pas La réponse de Tengiz qui définit les trois termes distincts que sont Factory, Abstract Factory et Factory Method.

424voto

John Feminella Points 116878

Avec le modèle Factory, vous produisez des instances d'implémentations ( Apple , Banana , Cherry etc.) d'une interface particulière -- disons, IFruit .

Avec le modèle Abstract Factory, vous fournissez un moyen pour quiconque de fournir sa propre usine. Cela permet à votre entrepôt d'être soit un IFruitFactory ou un IJuiceFactory sans que votre entrepôt ait besoin de connaître quoi que ce soit sur les fruits ou les jus.

0 votes

John, une usine doit-elle nécessairement produire des implémentations d'une interface ? Ne peut-elle pas exister comme une classe concrète autonome qui n'a pas besoin d'implémenter une interface ?

5 votes

@SPI Je pense que vous m'avez mal compris ; l'usine elle-même n'a pas besoin d'implémenter la fonction IFruit -- il instancie des choses qui mettent en œuvre IFruit . Bien sûr, ce n'est pas besoin de pour produire des instances de choses qui implémentent une interface particulière, mais c'est probablement une odeur de code si vous avez une usine qui produit des choses qui n'ont rien à voir les unes avec les autres.

0 votes

@John, merci de l'avoir éclairci ! Pendant quelques heures, tout mon système de croyance a été ébranlé haha Je ne peux m'empêcher d'être d'accord avec vous au sujet de l'odeur du code ; cela irait à l'encontre du but de la production en usine si les produits n'étaient pas liés les uns aux autres, n'est-ce pas ?

147voto

Sudhakar Kalmari Points 759

La source de ces informations provient de : http://java.dzone.com/news/intro-design-patterns-abstract

Usine abstraite et méthode d'usine

Les méthodes d'une fabrique abstraite sont mises en œuvre en tant que méthodes de fabrique. Le modèle de fabrique abstraite et le modèle de méthode de fabrique découplent le système client des classes d'implémentation réelles par le biais des types abstraits et des fabriques. La méthode Factory crée des objets par héritage, tandis que la fabrique abstraite crée des objets par composition.

Le modèle de fabrique abstraite se compose d'une fabrique abstraite (AbstractFactory), d'une fabrique concrète (ConcreteFactory), d'un produit abstrait (AbstractProduct), d'un produit concret (ConcreteProduct) et d'un client.

Comment mettre en œuvre

Le modèle de l'usine abstraite peut être mis en œuvre en utilisant le modèle de la méthode de l'usine, le modèle du prototype ou le modèle du singleton. L'objet ConcreteFactory peut être implémenté en tant que Singleton car une seule instance de l'objet ConcreteFactory est nécessaire.

Le modèle Factory Method est une version simplifiée du modèle Abstract Factory. Le modèle Factory Method est responsable de la création de produits qui appartiennent à une seule famille, tandis que le modèle Abstract Factory traite de multiples familles de produits.

La méthode Factory utilise des interfaces et des classes abstraites pour découpler le client de la classe du générateur et des produits qui en résultent. Abstract Factory possède un générateur qui est un conteneur pour plusieurs méthodes de fabrique, ainsi que des interfaces découplant le client du générateur et des produits.

Quand utiliser le modèle de la méthode Factory

Utilisez le modèle Factory Method lorsqu'il est nécessaire de découpler un client d'un produit particulier qu'il utilise. Utilisez la méthode Factory pour décharger un client de la responsabilité de créer et de configurer les instances d'un produit.

Quand utiliser le modèle de la fabrique abstraite

Utilisez le modèle Abstract Factory lorsque les clients doivent être découplés des classes de produits. Particulièrement utile pour la configuration et la modification des programmes. Le modèle Abstract Factory peut également imposer des contraintes sur les classes qui doivent être utilisées avec d'autres. Cela peut représenter beaucoup de travail de créer de nouvelles fabriques concrètes.

Ejemplos:

Exemple de fabrique abstraite 1

Cette spécification pour les disques pour préparer différents types de pâtes dans une machine à pâtes est l'usine abstraite, et chaque disque spécifique est une usine. Toutes les Factories (disques de la machine à pâtes) héritent leurs propriétés de la Factory abstraite. Chaque disque individuel contient les informations sur la façon de créer les pâtes, et le fabricant de pâtes ne les contient pas.

Exemple de fabrique abstraite 2 :

L'équipement d'emboutissage correspond à la fabrique abstraite, car il s'agit d'une interface pour les opérations qui créent des objets produits abstraits. Les matrices correspondent à l'usine concrète, car elles créent un produit concret. Chaque catégorie de pièces (capot, porte, etc.) correspond au produit abstrait. Les pièces spécifiques (par exemple, la porte côté conducteur d'une Camry 99) correspondent à l'usine concrète. les produits concrets.

Exemple de méthode d'usine :

L'entreprise de jouets correspond au Créateur, puisqu'elle peut utiliser l'usine pour créer des objets produits. La division de l'entreprise de jouets qui fabrique un type de jouet spécifique (cheval ou voiture) correspond au ConcreteCreator.

6 votes

Merci d'avoir expliqué Abstract Factory et Factory Method. Je n'ai pas compris où nous utilisons la composition dans la fabrique abstraite pour la création d'objets et où nous utilisons l'héritage dans la méthode de fabrique. Il serait très utile que vous postiez un code pour expliquer cela. Merci beaucoup. J'attends votre code. Merci encore.

0 votes

Même chose ici, il serait beaucoup plus clair si les approches de composition et d'héritage sont montrées avec un bref exemple (code source).

0 votes

101voto

cwap Points 6098

Modèle d'usine : La fabrique produit des implémentations d'IProduct.

Modèle de fabrique abstraite : Une usine produit des IFactories, qui à leur tour produisent des IProducts :)

[Mise à jour selon les commentaires]
Ce que j'ai écrit plus tôt n'est pas correct selon Wikipedia au moins. Une fabrique abstraite est simplement une interface de fabrique. Avec elle, vous pouvez changer vos usines au moment de l'exécution, pour permettre différentes usines dans différents contextes. Des exemples pourraient être des usines différentes pour différents OS, fournisseurs SQL, pilotes de middleware, etc.

5 votes

Joli ! Est-il correct de dire que l'usine abstraite est un ensemble de méthodes d'usine ?

2 votes

Je suppose que ce serait correct, mais ce serait également manquer le point :) Un exemple non analogue pourrait être une FileFactory qui possède des méthodes telles que CreateBitmapFile() ou CreateTextFile(). Maintenant, vous allez passer une référence à cette usine dans une sorte de service. Mais que se passerait-il si vous vouliez tester votre service ? Vous devrez créer une interface IFileFactory, pour simuler l'accès au système de fichiers. Maintenant, dans le monde réel, vous auriez probablement un cadre DI/IoC qui instancierait des IFileFactories en fonction de vos besoins. Dans ce cas, le cadre IoC servirait de fabrique abstraite.

6 votes

Si je comprends bien, cette réponse semble impliquer que la fabrique abstraite est toujours produit d'autres IFactories, qui peuvent à leur tour être utilisés pour créer des IProducts. La présentation dans le GdF ne me semble pas soutenir cela, et en fait le contredit : une instance d'une Abstract Factory produit directement des IProducts elle-même. En d'autres termes, une Abstract Factory du GdF est pas (ou plutôt, ne doit pas nécessairement être ) une "usine-usine".

43voto

Syed Tayyab Ali Points 1667

Le modèle de la fabrique abstraite

  • Fournir une interface pour créer familles d'objets liés ou dépendants dépendants sans spécifier leurs classes concrètes.

  • Le modèle Abstract Factory est très similaire au modèle Factory Method . Une différence entre les deux est qu'avec le modèle Abstract Factory une classe délègue la responsabilité de l'instanciation l'instanciation d'un objet à un autre objet via composition, alors que le modèle Factory méthode utilise l'héritage et s'appuie sur une sous-classe pour gérer la l'instanciation de l'objet souhaité.

  • En fait, l'objet délégué utilise fréquemment des méthodes d'usine pour pour effectuer l'instanciation !

Modèle d'usine

  • Les modèles d'usine sont des exemples de patrons de création

  • Les modèles de création permettent d'abstraire le processus d'instanciation des objets. Ils cachent comment les objets sont créés et aident à à rendre le système global indépendant de la façon dont ses objets sont créés et composés.

  • Les modèles de création de classe se concentrent sur l'utilisation de l'héritage pour décider de l'objet l'objet à instancier Méthode Factory

  • Les modèles de création d'objets se concentrent sur la délégation de l'instanciation à un autre objet Usine abstraite

Référence : Usine et usine abstraite

3 votes

Le lien de référence est mort

39voto

Craig Schwarze Points 3759

Méthode d'usine : Vous avez une usine qui crée des objets qui dérivent d'une classe de base particulière.

Usine abstraite : Vous avez une usine qui crée autres usines Ces fabriques créent à leur tour des objets dérivés des classes de base. En effet, il est fréquent de ne pas vouloir créer un seul objet (comme avec la méthode Factory), mais plutôt de vouloir créer une collection d'objets apparentés.

6 votes

Il s'agit d'une duplication de la réponse acceptée, et elle est tout aussi incorrecte.

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