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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Utilisation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } // ... ?>
ou (dans un autre script...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?php $var = Database::factory('MySQL'); ?>
Description :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <?php $var = MySQL::getInstance(); ?>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.
- 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.
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é.
Partager