Masques : Singleton dans Factory ?
Bonjour !
Dans le cadre de la création d'un CMS, j'ai créé une classe d'abstraction de base de données assortie des masques factory et singleton dont il y a un descriptif ici.
L'idée se décompose ainsi (en partant des exemples PHP) :
Classe d'abstraction : abstract Database
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
<?php
abstract class Database
{
private static $instance = NULL;
public static function factory($class)
{
if (class_exists($class))
{
if(isset(self::$instance) && self::$instance instanceof $class) {
return self::$instance;
}
self::$instance = new $class;
return self::$instance;
} else {
throw new Exception('Classe introuvable.');
}
}
public function __clone()
{
trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR);
}
}
?>
|
Exemple de classe membre : MySQL
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
<?php
class MySQL extends Database
{
private static $instance = NULL;
private $connection = FALSE;
protected function __construct()
{
$this->connect();
}
// Méthode Singleton interne.
public static function getInstance()
{
if (!isset(self::$instance)) {
$class = __CLASS__;
self::$instance = new $class;
}
return self::$instance;
}
// ...
?> |
Utilisation
Code:
1 2 3 4 5
|
<?php
$var = Database::factory('MySQL');
?>
|
ou (dans un autre script...)
Code:
1 2 3 4
|
<?php
$var = MySQL::getInstance();
?> |
Description :- Vérifie si la classe demandée existe (MySQL).
- Vérifie si une instance existe déjà et si c'est une instance de la classe demandée.
- Si oui, l'instance existante est retournée.
- Sinon, une nouvelle instance et créée puis retournée.
L'idée, c'est que les sous-classes (MySQL en l'occurence) pourraient être appellées par la classe d'abstraction (factory) ou alors par leur singleton interne.
Ce qui fait que les sous-classes pourrait être instanciées indépendement, avec leur propre singleton.
Note : J'ai légérement modifié le masque singleton, le constructeur est protected pour que la classe parente puisse fabriquer l'objet demandé.