Masques
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.
Usine
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. Un param�tre d'usine re�oit le nom de la classe pour l'instancier en tant qu'argument.
Exemple #1 M�thode de param�tre d'usine
<?php
class Exemple
{
// La m�thode de param�tre 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');
?>
Singleton
Le masque singleton est utilis� dans les situations o� l'on a besoin qu'il 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 #2 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;
?>