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.