Les masques sont un moyen de décrire les meilleures pratiques
et les bonnes conceptions. Ils proposent une solution flexible aux problèmes
habituels de programmation.
Le masque d'usine permet l'instanciation d'objets durant l'exécution.
Il est appelé "masque d'usine" puisqu'il est responsable de la "fabrication"
d'un objet.
Exemple 19-24. Méthode d'usine
<?php class Exemple { // La méthode d'usine public static function factory($type) { if (include_once 'Drivers/' . $type . '.php') { $classname = 'Driver_' . $type; return new $classname; } else { throw new Exception ('Driver non trouvé'); } } } ?>
|
Définir cette méthode dans une classe permet de charger un pilote à la
volée. Si la classe Example était une classe
d'abstraction de base de données, le chargement des pilotes
MySQL et SQLite pourrait être effectué
comme ceci :
<?php // Chargement du driver MySQL $mysql = Exemple::factory('MySQL');
// Chargement du driver SQLite $sqlite = Example::factory('SQLite'); ?>
|
|
Le masque singleton est utilisé dans les situations où l'on a besoin
qu'il n'y ait une unique instance d'une certaine classe.
L'exemple le plus commun est une connexion à une base de données.
L'implémentation de ce masque permet au développeur de rendre
cette unique instance facilement accessible par beaucoup d'autres objets.
Exemple 19-25. Fonction Singleton
<?php class Example { // instance de la classe private static $instance;
// Un constructeur privé ; empêche la création directe d'objet private function __construct() { echo 'Je suis construit'; }
// La méthode singleton public static function singleton() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; }
return self::$instance; }
// Exemple d'une méthode public function bark() { echo 'Woof!'; }
// Prévient les utilisateurs sur le clônage de l'instance public function __clone() { trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR); } }
?>
|
Ceci autorise une unique instance de la classe Example.
<?php // Ceci échoue car le constructeur est privé $test = new Example;
// Ceci récupère toujours une seule instance de la classe $test = Example::singleton(); $test->bark();
// Ceci provoque une erreur E_USER_ERROR. $test_clone = clone($test);
?>
|
|