582 votes

Quelles sont les différences entre les patrons de conception Abstract Factory et Factory ?

Je sais qu'il existe de nombreux articles sur les différences entre ces deux modèles, mais il y a quelques éléments que je ne trouve pas.

D'après ce que j'ai lu, je vois que le modèle de méthode factory permet de définir comment créer un seul produit concret, tout en cachant l'implémentation au client, qui verra un produit générique. Ma première question concerne l'usine abstraite. Son rôle est-il de vous permettre de créer des familles d'objets concrets (qui peuvent dépendre de la fabrique spécifique que vous utilisez) plutôt qu'un seul objet concret ? La fabrique abstraite ne renvoie-t-elle qu'un seul très gros objet ou plusieurs objets en fonction des méthodes que vous appelez ?

Mes deux dernières questions portent sur une seule citation que je n'arrive pas à comprendre entièrement et que j'ai vue à de nombreux endroits :

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

Si j'ai bien compris, le modèle de méthode d'usine possède une interface Creator qui fait que le ConcreteCreator est chargé de savoir quel ConcreteProduct instancier. Est-ce cela que signifie l'utilisation de l'héritage pour gérer l'instanciation des objets ?

Maintenant, en ce qui concerne cette citation, comment exactement le modèle Abstract Factory délègue-t-il la responsabilité de l'instanciation de l'objet à un autre objet via la composition ? Qu'est-ce que cela signifie ? À mes yeux, il semble que le modèle Abstract Factory utilise également l'héritage pour effectuer le processus de construction, mais là encore, je suis toujours en train d'apprendre à connaître ces modèles.

Toute aide, en particulier pour la dernière question, serait grandement appréciée.

4 votes

0 votes

Voir "comment l'instance a été créée" du point de vue du client, vous aiderait à comprendre le devis.

4 votes

@nawfal, les réponses dans ce fil sont affreuses.

14voto

Abdul Munim Points 9039

Prenons cet exemple pour mieux comprendre.

Que fournissent les entreprises de télécommunication ? Le haut débit, la ligne téléphonique et la téléphonie mobile, par exemple, et on vous demande de créer une application pour proposer leurs produits à leurs clients.

En général, ce que vous feriez ici, c'est de créer les produits, c'est-à-dire le haut débit, la ligne téléphonique et le téléphone mobile, par l'intermédiaire de votre entreprise. Méthode d'usine où vous savez quelles propriétés vous avez pour ces produits et c'est assez simple.

Aujourd'hui, l'entreprise souhaite proposer à ses clients un ensemble de produits, à savoir le haut débit, une ligne téléphonique et un téléphone portable, et c'est là que se situe le problème. Usine abstraite pour jouer.

Usine abstraite est, en d'autres termes, la composition d'autres usines qui sont chargées de créer leurs propres produits et Usine abstraite sait comment placer ces produits de manière plus significative par rapport à ses propres responsabilités.

Dans ce cas, le BundleFactory est l'usine abstraite, BroadbandFactory , PhonelineFactory et MobileFactory sont les Factory . Pour simplifier encore plus, ces usines auront Méthode d'usine pour initialiser les différents produits.

Voir l'exemple de code ci-dessous :

public class BroadbandFactory : IFactory {
    public static Broadband CreateStandardInstance() {
        // broadband product creation logic goes here
    }
}

public class PhonelineFactory : IFactory {
    public static Phoneline CreateStandardInstance() {
        // phoneline product creation logic goes here
    }
}

public class MobileFactory : IFactory {
    public static Mobile CreateStandardInstance() {
        // mobile product creation logic goes here
    }
}

public class BundleFactory : IAbstractFactory {

    public static Bundle CreateBundle() {
        broadband = BroadbandFactory.CreateStandardInstance();
        phoneline = PhonelineFactory.CreateStandardInstance();
        mobile = MobileFactory.CreateStandardInstance();

        applySomeDiscountOrWhatever(broadband, phoneline, mobile);
    }

    private static void applySomeDiscountOrWhatever(Broadband bb, Phoneline pl, Mobile m) {
        // some logic here
        // maybe manange some variables and invoke some other methods/services/etc.
    }
}

J'espère que cela vous aidera.

10voto

user2266614 Points 89

Méthode d'usine s'appuie sur l'héritage : La création d'objets est déléguée aux sous-classes, qui implémentent la méthode factory pour créer des objets.

Usine abstraite repose sur la composition d'objets : la création d'objets est implémentée dans des méthodes exposées dans l'interface de la fabrique.

Diagramme de haut niveau du modèle Factory et Abstract factory,

diagram

Pour plus d'informations sur la méthode Factory, voir cet article .

Pour plus d'informations sur la méthode Abstract factory, reportez-vous à cet article .

7voto

Exemple concret. (Facile à retenir)

Usine

Imaginez que vous construisiez une maison et que vous demandiez une porte à un charpentier. Vous lui donnez les dimensions de la porte et vos exigences, et il vous construit une porte. Dans ce cas, le menuisier est une usine de portes. Vos spécifications sont des entrées pour l'usine, et la porte est la sortie ou le produit de l'usine.

Usine abstraite

Maintenant, reprenons le même exemple de la porte. Vous pouvez aller chez un menuisier, ou vous pouvez aller dans un magasin de portes en plastique ou un magasin de PVC. Tous ces magasins sont des usines de fabrication de portes. En fonction de la situation, vous décidez à quel type d'usine vous devez vous adresser. C'est comme une usine abstraite.

J'ai expliqué ici les deux modèles Factory method et abstract factory en commençant par ne pas les utiliser, en expliquant les problèmes, puis en les résolvant à l'aide des modèles ci-dessus. https://github.com/vikramnagineni/Design-Patterns/tree/master

4voto

Anand Points 71

Il existe un grand nombre de définitions. Fondamentalement, les trois manières les plus courantes de décrire modèle d'usine sont

  1. Usine simple

Méthode/classe de création d'objet simple basée sur une condition.

  1. Méthode d'usine

Le modèle de conception Factory Method utilise des sous-classes pour fournir l'implémentation.

  1. Usine abstraite

Le modèle de conception Abstract Factory produit des familles d'objets liés ou dépendants sans spécifier leurs classes concrètes.

Le lien ci-dessous a été très utile - Comparaison des usines - refactoring.guru

3voto

Ravindra babu Points 5571
  1. Ma première question concerne l'usine abstraite. Son rôle est-il de vous permettre de créer des familles d'objets concrets (qui peuvent dépendre de la fabrique spécifique que vous utilisez) plutôt qu'un seul objet concret ?

Oui. L'intention de l'usine abstraite est :

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


  1. La fabrique abstraite ne renvoie-t-elle qu'un seul très gros objet ou plusieurs objets en fonction des méthodes que vous appelez ?

Idéalement, il devrait retourner un objet par méthode invoquée par le client.

  1. Si j'ai bien compris, le modèle de méthode d'usine possède une interface Creator qui fait que le ConcreteCreator est chargé de savoir quel ConcreteProduct instancier. Est-ce cela que signifie l'utilisation de l'héritage pour gérer l'instanciation des objets ?

Oui. La méthode Factory utilise l'héritage.

  1. Le pattern Abstract Factory délègue la responsabilité de l'instanciation d'un objet à un autre objet via la composition ? Qu'est-ce que cela signifie ?

AbstractFactory définit une FactoryMethod et ConcreteFactory est responsable de la construction d'un ConcreteProduct. Il suffit de suivre l'exemple de code dans ce article .

Vous pouvez trouver plus de détails dans les posts SE correspondants :

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

Patrons de conception : Factory vs Méthode Factory vs Factory 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