Abstract Factory

Catégorie

Patron de création

Problème

Fournir une interface pour créer des familles d’objets liés ou dépendants sans spécifier leurs classes concrètes. Utile lorsque vous devez vous assurer que les objets créés sont compatibles entre eux.

Solution

  • Définir une interface de fabrique abstraite avec des méthodes pour créer chaque type de produit
  • Créer des classes de fabrique concrètes, chacune responsable de la création d’une famille spécifique de produits
  • Le code client utilise l’interface de fabrique, sans jamais instancier directement de produits concrets
  • Changer de fabrique modifie l’ensemble de la famille de produits de manière cohérente

Structure

  • AbstractFactory : Déclare les opérations de création de types de produits abstraits
  • ConcreteFactory : Implémente les opérations de création pour une famille de produits spécifique
  • AbstractProduct : Déclare les interfaces pour un type d’objet produit
  • ConcreteProduct : Implémente l’interface du produit ; créé par la fabrique concrète correspondante
  • Client : Utilise uniquement les interfaces déclarées par AbstractFactory et AbstractProduct

Avantages clés

  • Compatibilité des produits — Tous les produits d’une même fabrique fonctionnent ensemble
  • Changement de familles de produits — Modifiez la fabrique active pour changer toute une famille de produits
  • Principe Ouvert/Fermé — De nouvelles familles de produits peuvent être ajoutées sans modifier le code client

Compromis

  • Difficile d’ajouter de nouveaux types de produits — Nécessite des modifications de l’interface de fabrique et de toutes les fabriques concrètes
  • Ajoute de la complexité — Plus de classes et d’abstractions que des patrons plus simples comme Factory Method

Quand l’utiliser

  • Un système doit être indépendant de la manière dont ses produits sont créés, composés et représentés
  • Un système doit être configuré avec l’une des familles de produits
  • Une famille d’objets produits liés est conçue pour être utilisée ensemble, et vous devez imposer cette contrainte

Exemples

  • Spring Framework utilise des fabriques abstraites pour créer des familles de widgets thématiques
  • Les frameworks GUI multi-plateformes créent des widgets spécifiques à la plateforme via des fabriques abstraites

Voir aussi