ConstructiCat Logo
CodeBust.
Browse section ▾

Comparaison des fabriques.

Cet article va montrer la différence entre :

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

On trouve des références à ces termes un peu partout sur le web. Bien qu’ils puissent se ressembler, ils ont tous des significations différentes. Beaucoup de gens ne s’en rendent pas compte, ce qui mène à la confusion et aux malentendus.

Essayons donc de cerner la différence et de régler ce problème une bonne fois pour toutes.

1. Fabrique (factory)

Fabrique est un terme ambigu qui désigne une fonction, une méthode ou une classe censée produire quelque chose. Le plus souvent, les fabriques produisent des objets. Mais elles peuvent aussi produire des fichiers, des enregistrements dans des bases de données, etc.

Par exemple, n’importe laquelle de ces choses peut être désignée familièrement comme une « fabrique » :

  • une fonction ou une méthode qui crée l’interface graphique d’un programme ;
  • une classe qui crée des utilisateurs ;
  • une méthode statique qui appelle le constructeur d’une classe d’une certaine manière ;
  • l’un des patrons de conception de création.

En général, lorsque quelqu’un prononce le mot « fabrique », le sens exact est censé être clair d’après le contexte. Mais si vous avez un doute, demandez simplement. Il se peut que l’auteur lui-même n’en sache rien.

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 tout résultat du patron méthode de fabrique est une « méthode de création », mais pas nécessairement l’inverse. Cela signifie aussi que vous pouvez substituer le terme « méthode de création » partout où Martin Fowler emploie le terme « méthode de fabrique » dans Refactoring et partout où Joshua Bloch emploie le terme « méthode de fabrique statique » dans Effective Java.

En réalité, la méthode de création n’est qu’une enveloppe autour d’un appel de constructeur. Elle peut simplement porter un nom qui exprime mieux vos intentions. Par ailleurs, elle peut aider à isoler votre code des modifications apportées au constructeur. Elle pourrait même contenir une logique particulière qui retournerait des objets existants au lieu d’en créer de nouveaux.

Beaucoup de gens appelleraient de telles méthodes « méthode de fabrique » simplement parce qu’elles produisent de nouveaux objets : le raisonnement est simple : la méthode crée des objets et, comme toutes les fabriques créent des objets, cette méthode doit clairement être une méthode de fabrique. Naturellement, la confusion est grande lorsqu’il s’agit du véritable patron Fabrique.

Dans l’exemple suivant, next 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

La méthode de création statique est une méthode de création déclarée static. Autrement dit, elle peut être appelée sur une classe et ne nécessite pas qu’un objet soit créé.

Ne soyez pas troublé si quelqu’un appelle de telles méthodes une « méthode de fabrique statique ». Ce n’est qu’une mauvaise habitude. La Fabrique est un patron de conception qui repose sur l’héritage. Si vous la rendez static, vous ne pouvez plus l’étendre dans des sous-classes, ce qui va à l’encontre de l’objectif du patron.

Lorsqu’une méthode de création statique retourne de nouveaux objets, elle devient un constructeur de substitution.

Elle peut être utile lorsque :

  • Vous devez disposer de plusieurs constructeurs ayant des objectifs différents mais dont les signatures coïncident. Par exemple, avoir à la fois Random(int max) et Random(int min) est impossible en Java, C++, C# et bien d’autres langages. Et le contournement le plus répandu consiste à créer plusieurs méthodes statiques qui appellent le constructeur par défaut puis fixent les valeurs appropriées.

  • Vous voulez réutiliser des objets existants au lieu d’en instancier de nouveaux (voir le patron Singleton). Dans la plupart des langages de programmation, les constructeurs doivent retourner de nouvelles instances de classe. La méthode de création statique est un contournement de cette limitation. À l’intérieur d’une méthode statique, votre code peut décider de créer une nouvelle instance en appelant le constructeur ou de retourner un objet existant depuis un cache.

Dans l’exemple suivant, la méthode load est une méthode de création statique. Elle offre un moyen pratique de récupérer des utilisateurs depuis 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 qui possède une seule méthode de création comportant une grande structure conditionnelle qui, en fonction des paramètres de la méthode, choisit quelle classe de produit instancier puis retourner.

Les gens confondent souvent les fabriques simples avec les fabriques en général ou avec l’un des patrons de conception de création. Dans la plupart des cas, une fabrique simple est une étape intermédiaire vers l’introduction des patrons Fabrique ou Fabrique abstraite.

Une fabrique simple est généralement représentée par une seule méthode dans une seule classe. Avec le temps, cette méthode peut devenir trop volumineuse et vous pourriez décider d’extraire des parties de la méthode dans des sous-classes. Une fois que vous l’aurez fait plusieurs fois, vous pourriez découvrir que l’ensemble s’est transformé en le classique patron méthode de fabrique.

Au passage, si vous déclarez une fabrique simple abstract, elle ne devient pas par magie le patron fabrique abstraite.

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 Fabrique (Factory Method)

La Fabrique (Factory Method)  est un patron de conception de création qui fournit une interface pour créer des objets tout en permettant aux sous-classes de modifier le type d’objet qui sera créé.

Si vous avez une méthode de création dans une classe de base et des sous-classes qui l’étendent, vous avez peut-être affaire à la méthode de 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 produire des familles d’objets liés ou dépendants sans spécifier leurs classes concrètes.

Que sont les « familles d’objets » ? Prenons par exemple cet ensemble de classes : Transport + Engine + Controls. Il pourrait en exister plusieurs variantes :

  1. Car + CombustionEngine + SteeringWheel
  2. Plane + JetEngine + Yoke

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

Et là encore, beaucoup de gens confondent le patron fabrique abstraite avec une classe de fabrique simple déclarée abstract. Ne faites pas cela !

Postface

Maintenant que vous connaissez la différence, jetez un regard neuf sur les patrons de conception :