Je lance ça sur Reddit.
Mets-moi un 👍 si tu aimes GitByBit
Je lance ça sur Reddit.
Mets-moi un 👍 si tu aimes GitByBit
Je lance ça sur Reddit.
Mets-moi un 👍 si tu aimes GitByBit
Je lance ça sur Reddit. Mets-moi un 👍 si tu aimes GitByBit

Comparaison des fabriques

Cet article va vous exposer les différences entre :

  1. Fabrique
  2. Méthode de création
  3. Méthode (ou fabrique) de création statique
  4. Fabrique simple
  5. Patron de conception Fabrique
  6. Fabrique abstraite

Vous trouverez des rĂ©fĂ©rences Ă  ces termes un peu partout sur Internet. MĂȘme s’ils se ressemblent, ils ont tous des significations diffĂ©rentes. Beaucoup ne s’en rendent pas compte, ce qui peut semer la confusion et mener Ă  des incomprĂ©hensions.

Essayons donc de dénicher les différences et résolvons ce problÚme une bonne fois pour toutes.

1. Fabrique

Fabrique est un terme ambigu utilisé pour représenter une fonction, méthode ou classe qui est censée produire quelque chose. En général, les fabriques produisent des objets. Elles peuvent également fabriquer des fichiers, des enregistrements de bases de données, etc.

Par exemple, on peut faire rĂ©fĂ©rence Ă  n’importe lequel des Ă©lĂ©ments suivants en l’appelant « fabrique » :

  • Une fonction ou mĂ©thode qui crĂ©e l’interface graphique utilisateur (GUI) d’un programme.
  • Une classe qui crĂ©e des utilisateurs.
  • Une mĂ©thode statique qui appelle un constructeur de classe d’une maniĂšre un peu particuliĂšre.
  • Un des patrons de conception de crĂ©ation.

En gĂ©nĂ©ral, lorsque quelqu’un parle d’une « fabrique », il est possible de comprendre exactement de quoi il s’agit en s’aidant du contexte. En cas de doute, n’hĂ©sitez pas Ă  demander des prĂ©cisions. Il est possible que l’auteur ne connaisse mĂȘme pas ces diffĂ©rences.

2. Méthode de création

La mĂ©thode de crĂ©ation est dĂ©finie dans le livre Refactoring To Patterns comme « une mĂ©thode qui crĂ©e des objets ». Cela signifie que chaque rĂ©sultat du patron de conception fabrique est une « mĂ©thode de crĂ©ation », mais pas l’inverse. Cela signifie Ă©galement que vous pouvez remplacer le terme « mĂ©thode de crĂ©ation » partout oĂč Martin Fowler utilise « fonction factory » (factory method) dans Refactoring ou lorsque Joshua Bloch Ă©crit « mĂ©thode de fabrique statique » dans Java efficace.

En rĂ©alitĂ©, la mĂ©thode de crĂ©ation est juste un emballeur qui englobe un appel au constructeur. Son nom importe peu, tant qu’il exprime vos intentions. Il peut toutefois vous aider Ă  isoler votre code des modifications apportĂ©es au constructeur. Il peut mĂȘme contenir une certaine logique qui renvoie des objets existants au lieu d’en crĂ©er de nouveaux.

Beaucoup de personnes vont appeler ce genre de mĂ©thodes des « fabriques » juste parce qu’elles fabriquent de nouveaux objets. C’est plutĂŽt Ă©vident : la mĂ©thode crĂ©e des objets. Puisque toutes les fabriques crĂ©ent des objets, cette mĂ©thode doit logiquement ĂȘtre une fabrique. Il est donc naturel d’ĂȘtre un peu confus lorsque l’on parle du vrai patron de conception Fabrique.

Dans l’exemple suivant, next (suivant) est une mĂ©thode de crĂ©ation :

class Number {
    private $value;

    public function __construct($value) {
        $this->value = $value;
    }

    public function next() {
        return new Number ($this->value + 1);
    }
}

3. Méthode de création statique

Une mĂ©thode de crĂ©ation statique est une mĂ©thode de crĂ©ation dĂ©clarĂ©e en static. En d’autres termes, elle peut ĂȘtre appelĂ©e dans une classe et n’a pas besoin d’un objet pour ĂȘtre créée.

Ne soyez donc pas Ă©tonnĂ© lorsque quelqu’un appelle une telle mĂ©thode une « mĂ©thode de fabrique statique ». C’est juste une mauvaise habitude. La Fabrique est un patron de conception qui repose sur l’hĂ©ritage. Si vous la rendez static, vous neutralisez l’utilitĂ© du patron, car vous ne pouvez plus l’étendre dans des sous-classes.

Lorsqu’une mĂ©thode de crĂ©ation statique renvoie de nouveaux objets, elle devient un autre constructeur possible.

Cela se révÚle utile si :

  • Vous avez besoin de plusieurs constructeurs diffĂ©rents, mais leurs signatures sont identiques. Par exemple, avoir en mĂȘme temps Random(int max) et Random(int min) est impossible en Java, C++, C# et dans bien d’autres langages. Le contournement le plus utilisĂ© consiste Ă  crĂ©er plusieurs mĂ©thodes statiques qui appellent le constructeur par dĂ©faut, et Ă  affecter les valeurs appropriĂ©es par la suite.

  • Vous voulez rĂ©utiliser des objets existants plutĂŽt que d’en instancier de nouveaux (se rĂ©fĂ©rer au patron de conception Singleton). Dans la majoritĂ© des langages de programmation, les constructeurs doivent retourner de nouvelles instances de classes. La mĂ©thode de crĂ©ation statique permet de contourner cette limitation. À l’intĂ©rieur de la mĂ©thode statique, votre code va dĂ©cider s’il veut crĂ©er une instance toute fraiche en appelant le constructeur, ou s’il prĂ©fĂšre renvoyer un objet existant depuis le cache.

Dans l’exemple suivant, load (charger) est une mĂ©thode de crĂ©ation statique. Elle fournit une maniĂšre pratique de rĂ©cupĂ©rer les utilisateurs dans une base de donnĂ©es.

class User {
    private $id, $name, $email, $phone;

    public function __construct($id, $name, $email, $phone) {
        $this->id = $id;
        $this->name = $name;
        $this->email = $email;
        $this->phone = $phone;
    }

    public static function load($id) {
        list($id, $name, $email, $phone) = DB::load_data('users', 'id', 'name', 'email', 'phone');
        $user = new User($id, $name, $email, $phone);
        return $user;
    }
}

4. Patron fabrique simple

Le patron Fabrique simple  dĂ©crit une classe ayant une mĂ©thode de crĂ©ation qui choisit la classe du produit Ă  instancier Ă  l’aide d’un gros bloc conditionnel basĂ© sur les paramĂštres de la mĂ©thode, puis la renvoie.

Les fabriques simples sont souvent confondues avec les fabriques générales ou avec un des patrons de création. Dans la majorité des cas, une fabrique simple est une étape intermédiaire pour mettre en place un patron de conception Fabrique ou Fabrique abstraite.

Une fabrique simple est souvent représentée par une unique méthode dans une seule classe. Avec le temps, cette méthode peut devenir trop longue et vous pourriez décider de transférer certaines parties dans des sous-classes. Lorsque vous aurez rencontré cette situation plusieurs fois, vous vous rendrez compte que tout ceci équivaut en fait à un patron de conception fabrique.

Au passage, si vous déclarez une fabrique simple abstract, elle ne se transforme pas en fabrique abstraite comme par magie.

Voici un exemple de fabrique simple :

class UserFactory {
    public static function create($type) {
        switch ($type) {
            case 'user': return new User();
            case 'customer': return new Customer();
            case 'admin': return new Admin();
            default:
                throw new Exception('Wrong user type passed.');
        }
    }
}

5. Patron de conception fabrique

La Fabrique  est un patron de crĂ©ation qui dĂ©finit une interface pour crĂ©er des objets, mais permet aux sous-classes de modifier le type de l’objet qui sera créé.

Si vous voyez une mĂ©thode de crĂ©ation dans une classe de base et des sous-classes qui l’étendent, il s’agit peut-ĂȘtre d’une fabrique.

abstract class Department {
    public abstract function createEmployee($id);

    public function fire($id) {
        $employee = $this->createEmployee($id);
        $employee->paySalary();
        $employee->dismiss();
    }
}

class ITDepartment extends Department {
    public function createEmployee($id) {
        return new Programmer($id);
    }
}

class AccountingDepartment extends Department {
    public function createEmployee($id) {
        return new Accountant($id);
    }
}

6. Patron fabrique abstraite

La Fabrique Abstraite  est un patron de conception de crĂ©ation qui permet de crĂ©er des familles d’objets apparentĂ©s sans prĂ©ciser leur classe concrĂšte.

Mais que sont « des familles d’objets » ? Prenons cet ensemble de classes comme exemple : Transport + Moteur + ContrĂŽles. Plusieurs variantes peuvent exister :

  1. Voiture + MoteurCombustion + Volant
  2. Avion + MoteurRéaction + Manche

Si votre programme fonctionne sans familles de produits, vous n’avez pas besoin d’une fabrique abstraite.

Je vais me rĂ©pĂ©ter, mais beaucoup confondent la fabrique abstraite avec une classe fabrique toute simple dĂ©clarĂ©e abstract. Ne faites pas cette erreur !

Postface

Maintenant que vous savez les différencier, posez un regard nouveau sur ces patrons :