Le pattern factory est un modèle de conception qui permet de créer des objets sans avoir à les instancier directement dans le code.
Il offre une flexibilité accrue dans la gestion des classes et facilite la maintenance du code. En utilisant le pattern factory en PHP, il est possible de créer des objets dynamiquement et de manière efficiente.
Problème
On peut comparer le pattern factory en PHP à un restaurant qui propose différents types de plats.
Sans utiliser le pattern factory, chaque plat serait préparé directement en cuisine, ce qui pourrait poser plusieurs problèmes :
- Si un ingrédient venait à manquer, il faudrait modifier chaque recette qui en utilise.
- Si le chef qui prépare le plat venait à changer, il faudrait modifier chaque recette qu’il connaissait.
- Si le plat était très demandé, le temps d’attente pour les clients pourrait être très long.
En utilisant le pattern factory, les plats peuvent être créés à la demande, de manière flexible et centralisée. Chaque plat serait considéré comme une classe, et l’usine serait le restaurant qui produit ces classes.
Solution
Pour continuer sur la même analogie du restaurant :
- Ainsi, si un ingrédient venait à manquer, le restaurant pourrait le remplacer par un autre sans avoir à modifier chaque recette, tout comme le pattern factory permet de remplacer une classe par une autre sans avoir à modifier le code qui l’utilise.
- Si le chef venait à changer, cela n’aurait pas d’impact sur la production des plats, tout comme le pattern factory permet de créer des objets de différentes classes sans avoir à connaître la logique interne de chaque classe.
- Enfin, si le plat était très demandé, le restaurant pourrait augmenter la production de ce plat en utilisant la même recette, tout comme le pattern factory permet de créer plusieurs objets de la même classe sans avoir à dupliquer le code de création.
Implémentation
Le pattern Factory est un modèle de conception (design pattern) qui permet de créer des objets sans avoir à spécifier leur classe concrète. Il permet également de simplifier la création d’objets en regroupant la logique de création dans une seule méthode ou classe, plutôt que de la répéter à plusieurs endroits du code.
Voici les étapes clés pour implémenter le pattern Factory en PHP :
- Créez une interface ou une classe abstraite pour définir le comportement général des objets que vous voulez créer. Cette interface ou classe abstraite contient les méthodes communes à toutes les classes concrètes que vous voulez créer.
- Créez des classes concrètes qui implémentent cette interface ou héritent de cette classe abstraite. Ces classes concrètes représentent les objets spécifiques que vous voulez créer.
- Créez une classe Factory qui contient une méthode qui crée des objets en fonction de certains critères, tels que des paramètres ou des configurations.
- Dans la méthode de la classe Factory, utilisez une instruction switch ou une série de conditions if/else pour déterminer quelle classe concrète instancier en fonction des critères.
- Retournez l’objet créé à partir de la méthode de la classe Factory.
- Utilisez la classe Factory pour créer des objets dans votre application plutôt que d’appeler directement le constructeur de la classe concrète.
En suivant ces étapes, vous pouvez facilement créer des objets sans vous soucier de leur classe concrète. Cela facilite également la maintenance de votre code en réduisant le nombre de points où vous devez modifier votre code lorsque vous ajoutez de nouvelles classes concrètes ou changez la logique de création.
Supposons que nous ayons une interface Animal et deux classes concrètes Cat et Dog qui implémentent cette interface. Nous voulons maintenant créer une classe Factory AnimalFactory qui peut instancier une instance de Cat ou de Dog en fonction d’un paramètre spécifié.
Voici le code pour l’interface Animal :
interface Animal {
public function speak();
}
Et voici les classes concrètes Cat et Dog :
class Cat implements Animal {
public function speak() {
echo "Miaou";
}
}
class Dog implements Animal {
public function speak() {
echo "Waaf";
}
}
Maintenant, voici la classe Factory AnimalFactory qui permet de créer des instances de Cat ou de Dog en fonction d’un paramètre spécifié :
class AnimalFactory {
public function createAnimal($animalType) {
switch ($animalType) {
case 'cat':
return new Cat();
case 'dog':
return new Dog();
default:
throw new InvalidArgumentException("Type d'animal inconnu !!!");
}
}
}
La méthode createAnimal de la classe Factory prend un paramètre $animalType qui spécifie quel type d’animal créer. Si le paramètre est ‘cat’, la méthode crée une instance de Cat et la retourne. Si le paramètre est ‘dog’, la méthode crée une instance de Dog et la retourne. Si le paramètre est autre chose, la méthode lance une exception.
Ainsi, pour créer une instance d’un animal en utilisant la Factory, nous pouvons faire ce qui suit :
$animalFactory = new AnimalFactory();
$cat = $animalFactory->createAnimal('cat');
$cat->speak(); // affichera "Miaou"
$dog = $animalFactory->createAnimal('dog');
$dog->speak(); // affichera "Waaf"
Dans cet exemple, nous avons créé une instance de la Factory AnimalFactory et utilisé sa méthode createAnimal pour créer des instances de Cat et de Dog. La Factory nous permet de créer des instances d’objets sans avoir à connaître leur classe concrète et en encapsulant la logique de création dans une seule classe.