Design Patterns: Différence entre Factory et Abstract factory

J’ai lu des designs patterns sur un site web

J’y ai lu des informations sur Factory, et Abstract factory, mais elles sont tellement confuses que je ne comprends pas bien leur définition. D’après les définitions:

Factory - Crée des objets sans exposer la logique d’instanciation aux clients et fait référence à l’objet nouvellement créé par le biais d’une interface commune. Il s’agit d’une version simplifiée de la méthode Factory.

Abstract Factory - Offre une interface permettant de créer une famille d’objets liés, sans spécifier explicitement leurs classes.

Quelqu’un peut-il me dire

  • Comment ces deux modèles diffèrent-ils les uns des autres ?
  • Quand doit-on utiliser l’un ou l’autre ?
  • Et aussi, si possible, des exemples en java liés à ces modèles ?

Ces deux types de Factory font la même chose : ce sont des « constructeurs intelligents ».

Supposons que vous souhaitiez créer deux types de fruits : Apple et Orange.

Factory

Factory est « fixe », c’est-à-dire qu’il n’existe qu’une seule implémentation, sans sous-classe. Dans ce cas, vous aurez une classe comme celle-ci :

class FruitFactory {

  public Apple makeApple() {
    // Code pour la création d'un Apple ici.
  }

  public Orange makeOrange() {
    // Code pour la création d'un Orange ici.
  }

}

Abstract Factory

Abstract Factory est normalement utilisée pour des choses comme l’injection de dépendance/stratégie, lorsque vous voulez être en mesure de créer toute une famille d’objets qui doivent être du « même type », et avoir des classes de base communes. Voici un exemple vaguement lié aux fruits. Le cas d’utilisation ici est que nous voulons nous assurer que nous n’utilisons pas accidentellement un OrangePicker sur une Apple. Tant que nous obtenons notre Fruit et notre Picker de la même factory, ils seront identiques.

interface PlantFactory {
  
  Plant makePlant();

  Picker makePicker(); 

}

public class AppleFactory implements PlantFactory {
  Plant makePlant() {
    return new Apple();
  }

  Picker makePicker() {
    return new ApplePicker();
  }
}

public class OrangeFactory implements PlantFactory {
  Plant makePlant() {
    return new Orange();
  }

  Picker makePicker() {
    return new OrangePicker();
  }
}