Éditer sur GitHub

Factory (Fabrique)

Problème

La fabrique classique s'adresse à la problématique de la création d'instances dérivées d'une classe. Nous verrons qu'elle admet plusieurs variantes.

Cas d'école

Nous avons par exemple la hiérarchie suivante :

UML_DP_FabriqueAnimal

Supposons que nous devons créer des instances de la classe Animal dans plusieurs parties de l'application (chargement à partir d'un fichier CSV, chargement à partir d'une requête sur une API,...)

A chaque fois, nous devrons faire appel à "new" en fonction du type de l'animal :

let animal: Animal = null ;
if ( typeAnimal == "chat" ){
    animal = new Chat() ;
}else if (typeAnimal == "chien"){
    ranimal = new Chien() ;
}else{
    throw new AnimalTypeNotFound(typeAnimal);
}
animal.setNom(nomAnimal);

En cas d'ajout d'un type d'animal, nous devrons modifier tous les codes créant des animaux.

Solution

Nous pouvons définir une classe avec une méthode dédiée à la création des instances en fonction d'un type :

UML Fabrique

Le code gérant la logique de création en fonction du type sera localisé dans cette fabrique :

class FabriqueAnimal {
    public createAnimal(typeAnimal: string): Animal {
        if ( typeAnimal == "chat" ){
            return new Chat() ;
        }else if (typeAnimal == "chien"){
            return new Chien() ;
        }else{
            throw new AnimalTypeNotFound(typeAnimal);
        }
    }
}

Il sera alors possible d'ajouter un type sans modifier les codes faisant appel à cette fabrique :

const animal = animalFactory.createAnimal(typeAnimal) ;
animal.setNom(nomAnimal);

Variantes

Nous trouverons de nombreuses variantes du concept de fabrique :

AnimalFactory.createByType("chien")
FractalFactory.createSierpinskiTriangles(8);

UML_DP_FactoryMethod

UML_DP_FactoryMethod

Liens utiles