Question Quelle est la différence fondamentale entre les motifs d'usine et les motifs d'usine abstraits? [fermé]


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


429
2018-06-16 14:14


origine


Réponses:


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

Avec le modèle Usine abstraite, vous fournissez un moyen pour quiconque de fournir sa propre usine. Cela permet à votre entrepôt d'être soit IFruitFactory ou un IJuiceFactory, sans exiger de votre entrepôt de rien savoir sur les fruits ou les jus.


374
2018-06-16 14:18



Source pour cette information tirée de: http://java.dzone.com/news/intro-design-patterns-abstract

Méthode abstraite contre usine

Les méthodes d'une fabrique abstraite sont implémentées en tant que méthodes d'usine. 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 actuelles en passant par les types abstraits et les fabriques. La méthode usine crée des objets via l'héritage, où l'usine abstraite crée des objets via la composition.

Le modèle de fabrique abstraite se compose d'une AbstractFactory, de ConcreteFactory, de AbstractProduct, de ConcreteProduct et d'un client.

Comment mettre en œuvre

Le modèle d'usine abstrait peut être implémenté en utilisant le modèle de méthode d'usine, le modèle de prototype ou le modèle singleton. L'objet ConcreteFactory peut être implémenté en tant que Singleton car une seule instance de l'objet ConcreteFactory est requise.

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

Factory Method utilise des interfaces et des classes abstraites pour découpler le client de la classe du générateur et des produits résultants. Abstract Factory a un générateur qui est un conteneur pour plusieurs méthodes d'usine, ainsi que des interfaces qui découplent le client du générateur et des produits.

Quand utiliser le modèle de méthode d'usine

Utilisez le modèle de méthode d'usine lorsqu'il est nécessaire de découpler un client d'un produit particulier qu'il utilise. Utilisez la méthode usine pour décharger un client de la responsabilité de la création et de la configuration des instances d'un produit.

Quand utiliser le motif d'usine abstrait

Utilisez le modèle Fabrique abstraite lorsque les clients doivent être découplés des classes de produits. Particulièrement utile pour la configuration et la modification du programme. Le modèle de fabrique abstraite peut également imposer des contraintes sur les classes à utiliser avec les autres. Faire de nouvelles usines de béton peut représenter beaucoup de travail.

Exemples:

Exemple d'usine abstraite 1

Cette spécification pour les disques pour préparer différents types de pâtes dans un fabricant de pâtes, la fabrique abstraite, et chaque disque spécifique est une fabrique. Toutes les usines (disques de fabricants de pâtes) héritent leurs propriétés de l'usine abstraite. Chaque disque individuel contient des informations sur la manière de créer les pâtes, contrairement au fabricant de pâtes.

Exemple d'usine abstraite 2:

L'équipement d'estampage correspond à l'usine abstraite, car c'est un interface pour les opérations qui créent des objets de produit abstraits. Les matrices correspondent à l'usine de béton, car elles créent un produit concret. Chaque catégorie de pièce (capot, porte, etc.) correspond au produit abstrait. Pièces spécifiques (c.-à-d. Porte côté conducteur pour 99 cames) correspondant à les produits en béton.

Exemple de méthode d'usine:

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


130
2018-04-13 18:20



Modèle d'usine: L'usine produit des implémentations IProduct

Modèle d'usine abstraite: Une usine-usine produit des IFactories, qui à leur tour produisent des IProduct :)

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


95
2018-06-16 14:16



Le modèle d'usine abstraite

  • Fournir une interface pour créer familles de personnes apparentées ou dépendantes objets sans spécifier leur classes concrètes.

  • Le motif de l’usine abstraite est très similaire à la méthode d'usine modèle. Une différence entre le deux est que avec la fabrique abstraite modèle, une classe délègue le responsabilité de l'objet instanciation à un autre objet via composition alors que l'usine Le modèle de méthode utilise l'héritage et repose sur une sous-classe pour gérer le Instanciation d'objet souhaitée.

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

Modèle d'usine

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

  • Les motifs créatifs abstraits le processus d'instanciation d'objet. Ils cacher la façon dont les objets sont créés et aider rendre le système global indépendant de la façon dont ses objets sont créés et composé.

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

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

Référence: Usine vs Usine abstraite


41
2018-06-16 14:16



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

Usine abstraite: Vous avez une usine qui crée autres usineset ces usines créent à leur tour des objets dérivés de classes de base. Vous faites cela parce que vous ne voulez souvent pas créer un seul objet (comme avec la méthode Factory) - vous voulez plutôt créer une collection d'objets associés.


37
2018-05-06 07:10



La fabrique abstraite est une interface permettant de créer des objets associés, mais la méthode d'usine est une méthode. L'usine abstraite est implémentée par la méthode d'usine.

enter image description here


35
2017-12-18 02:17



Différence de base:

Usine: Crée des objets sans exposer la logique d'instanciation au client.

Méthode d'usine: Définissez une interface pour créer un objet, mais laissez les sous-classes décider quelle classe instancier. La méthode Factory permet à une classe de différer l'instanciation des sous-classes

Usine abstraite: Fournit une interface pour créer des familles d'objets associés ou dépendants sans spécifier leurs classes concrètes.

AbstractFactory pattern utilise la composition pour déléguer la responsabilité de créer un objet à une autre classe Méthode d'usine pattern utilise l'héritage et s'appuie sur une classe ou une sous-classe dérivée pour créer un objet

De oodesign des articles:

Usine diagramme de classe:

enter image description here

Exemple: StaticFactory

 public class ShapeFactory {

   //use getShape method to get object of type shape 
   public static Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}

L'exemple d'implémentation FactoryMethod de Factory non statique est disponible dans cet article:

Design Patterns: Usine vs méthode d'usine vs Usine abstraite

Quand utiliser: Le client a juste besoin d'une classe et ne se soucie pas de l'implémentation concrète qu'il obtient.

Méthode d'usine classe digaram:

enter image description here

Quand utiliser: Le client ne sait pas quelles classes concrètes il sera nécessaire de créer lors de l'exécution, mais veut juste obtenir une classe qui fera le travail.

Usine abstraite diagramme de classe de dzone

enter image description here

Quand utiliser: Lorsque votre système doit créer plusieurs familles de produits ou que vous souhaitez fournir une bibliothèque de produits sans exposer les détails d'implémentation.

Les exemples de code source dans les articles ci-dessus sont très bons pour comprendre clairement les concepts.

Question SE associée avec exemple de code:

Modèle d'usine. Quand utiliser les méthodes d'usine?

Différences:

  1. Les classes Factory abstraites sont souvent implémentées avec les méthodes Factory, mais elles peuvent aussi être implémentées avec Prototype
  2. Les conceptions commencent en utilisant la méthode usine (moins complexes, plus personnalisables, les sous-classes prolifèrent) et évoluent vers d'autres modèles de création (plus flexibles, plus complexes) où plus de flexibilité est nécessaire.
  3. Les méthodes d'usine sont généralement appelées dans les méthodes de modèle.

Autres articles utiles:

factory_method de la fabrication

abstract_factory de la fabrication

modèle de conception abstraite-usine de journaldev


29
2018-03-01 04:24



Exemple / scénario pour la fabrique abstraite

Je vis dans un endroit où il pleut pendant la saison des pluies, de la neige en hiver et du chaud et du soleil en été. J'ai besoin de différents types de vêtements pour me protéger des éléments. Pour ce faire, je vais au magasin près de chez moi et demande des vêtements / articles pour me protéger. Le magasinier me donne l'article approprié selon l'environnement et la profondeur de ma poche. Les articles qu'il me donne sont du même niveau de qualité et de gamme de prix. Comme il est conscient de mes normes, il est facile pour lui de le faire. Mais quand un gars riche de l'autre côté de la rue arrive avec les mêmes exigences, il reçoit un article de marque, cher. Une chose notable est que tous les éléments qu'il me donne se complètent en termes de qualité, de standard et de coût. On peut dire qu'ils vont les uns avec les autres. C'est le cas des objets que ce riche mec reçoit.

Donc, en regardant le scénario ci-dessus, j'apprécie maintenant l'efficacité du magasinier. Je peux remplacer ce commerçant avec un magasin abstrait. Les articles que nous recevons avec des articles abstraits et moi et les riches comme clients en perspective. Tout ce dont nous avons besoin est le produit / article qui correspond à nos besoins.

Maintenant, je peux facilement voir un magasin en ligne qui fournit un ensemble de services à ses nombreux clients. Chaque client appartient à l'un des trois groupes. Lorsqu'un utilisateur du groupe premium ouvre le site, il obtient une grande interface utilisateur, volet publicitaire très personnalisé, plus d'options dans les menus, etc. Ces mêmes caractéristiques sont présentées à l'utilisateur d'or, mais la fonctionnalité dans le menu est moins, les annonces sont la plupart du temps relevent, et légèrement moins d'interface utilisateur egronomic. Last est mon genre d'utilisateur, un utilisateur «groupe libre». Je suis juste assez servi pour que je ne sois pas offensé. L'interface utilisateur est un strict minimum, les publicités sont tellement décalées que je ne sais pas ce qui s'y trouve, enfin le menu est seulement déconnecté.

Si j'ai la chance de construire quelque chose comme ce site, je considérerais certainement Abstract Factory Pattern.

Produits abstraits: volet de publicité, menu, peintre d'interface utilisateur.
Fabrique abstraite: expérience utilisateur Web Store
Concreate Factory: Expérience utilisateur Premium, expérience utilisateur Gold, expérience utilisateur générale.


21
2017-10-20 06:02



//Abstract factory - Provides interface to create factory of related products
interface PizzaIngredientsFactory{    
   public Dough createDough(); //Will return you family of Dough
   public Clam createClam();   //Will return you family of Clam
   public Sauce createSauce(); //Will return you family of Sauce
}

class NYPizzaIngredientsFactory implements PizzaIngredientsFactory{

   @Override
   public Dough createDough(){
      //create the concrete dough instance that NY uses
      return doughInstance;
   }

   //override other methods
} 

Les définitions du livre de texte sont déjà fournies par d'autres réponses. Je pensais que je donnerais un exemple de cela aussi.

Alors voici le PizzaIngredientsFactory est un usine abstraite car il fournit des méthodes pour créer une famille de produits connexes.

Notez que chaque méthode de l'usine Abstract est un Méthode d'usine en soi. Comme createDough() est en soi une méthode d'usine dont les implémentations concrètes seront fournies par des sous-classes comme NYPizzaIngredientsFactory. Donc, en utilisant chaque endroit différent peut créer des instances d'ingrédients concrets qui appartiennent à leur emplacement.

Méthode d'usine

Fournit une instance d'implémentation concrète

Dans l'exemple:
 - createDough() - assure la mise en œuvre concrète de la pâte. Donc, c'est une méthode d'usine

Usine abstraite

Fournit une interface pour créer une famille d'objets associés

Dans l'exemple:
 - PizzaIngredientsFactory est une fabrique abstraite car elle permet de créer un ensemble d'objets apparentés comme Dough, Clams, Sauce. Pour créer chaque famille d'objets, il fournit une méthode d'usine.

Exemple de Head First modèles de conception


15
2017-08-09 06:48



Beaucoup de gens se sentiront peut-être surpris, mais cette question est Incorrect. Si vous entendez cette question lors d'une entrevue, vous devez aider l'intervieweur à comprendre où se trouve la confusion.

Commençons par le fait qu'il n'y a pas de motif concret qu'on appelle juste "Usine". Il existe un motif appelé "Abstract Factory", et il existe un motif appelé "Factory Method".

Alors, que signifie "Factory" alors? l'un des suivants (tout peut être considéré comme correct, en fonction de la portée de la référence):

  • Certaines personnes l'utilisent comme un alias (raccourci) pour "Usine abstraite".
  • Certaines personnes l'utilisent comme un alias (raccourci) pour "Méthode d'usine".
  • Certaines personnes l'utilisent comme un nom plus général pour tous les modèles d'usine / de création. Par exemple. "Abstract Factory" et "Factory Method" sont des usines.

Et, malheureusement, beaucoup de gens utilisent "Factory" pour désigner un autre type d'usine, qui crée des usines ou des usines (ou leurs interfaces). Basé sur leur théorie:

Le produit implémente IProduct, qui est créé par Factory, qui   implémente IFactory, qui est créé par AbstractFactory.

Pour comprendre à quel point c'est stupide, continuons notre équation:

AbstractFactory implémente IAbstractFactory, qui est créé par ...   AbstractAbstractFactory ???

J'espère que vous voyez le point. Ne soyez pas confus, et s'il vous plaît ne pas inventer des choses qui n'existent pas pour la raison.

-

P.S.: Factory for Products est AbstractFactory et Factory for Abstract Factories est également un exemple de AbstractFactory.


14
2017-12-19 18:54