Vous trouverez dans cet article un exemple d'utilisation du patron de conception Fabrique (Factory) en PHP.
Définition
Ce patron de conception permet de mettre en place une classe qui va se charger d'instancier les classes nécessaires au fonctionnement de votre application. Cette classe permet au code client de se libérer de toute responsabilité (implémentation, configuration et instanciation).
Ce patron de conception peut être intéressant quand vous devez instancier des objets qui implémentent la même interface ou la même classe abstraite mais qui s'utilisent dans des contextes différents (par exemple une classe pour PostgreSQL, une autre pour MySQL). Il est également utile si on veut centraliser un code qui à la responsabilité de la création d'un objet.
Exemple
Dans notre application, selon le contexte, on veut soit utiliser une base PostgreSQL, soit une base MySQL. On va utiliser la Fabrique pour éviter de devoir réécrire le code si on change de base de données. On commence par l'interface. Une méthode pour se connecter, une deuxième pour envoyer une requête :
interface DatabaseInterface
{
public function connect($params);
public function query($query);
}
Ensuite, nos 2 classes qui vont implémenter cette interface. Pour PostgreSQL :
class DBPgsql implements DatabaseInterface
{
public function connect($params)
{
// Implémentation spécifique
}
public function query($query)
{
// Implémentation spécifique
}
}
Pour MySQL :
class DBMysql implements DatabaseInterface
{
public function connect($params)
{
// Implémentation spécifique
}
public function query($query)
{
// Implémentation spécifique
}
}
Il nous reste à créer la classe Fabrique. Elle comporte une méthode create() qui en fonction du type indiqué, va instancier la bonne classe :
class DatabaseFactory
{
public static function create($type)
{
switch ($type) {
case 'pgsql':
$db = new DBPgsql(/* on passe en argument les infos de connexion */);
break;
case 'mysql':
$db = new DBMysql(/* on passe en argument les infos de connexion */);
default:
throw new Exception('Unknown database');
}
return $db;
}
}
On peut maintenant utiliser cette classe dans le code de l'application :
$db = DatabaseFactory:create('pgsql');
Si un jour, on veut passer sur MySQL, on a juste à modifier une ligne :
$db = DatabaseFactory:create('mysql');
Si on veut ajouter un nouveau type de base de données, il suffit d'implémenter l'interface dans une nouvelle classe et de modifier légèrement la classe Fabrique.