Design Patterns: Différence entre Factory et Abstract factory

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();
  }
}