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;

?>