Un Singleton multi instances…
Modifier le fonctionnement de son Singleton
Je reviens sur le pattern Singleton, car actuellement je travaille sur un projet perso et celui-ci m’a posé un probleme…
Dans mon cas précis, je me sers du Singleton pour gerer une classe de Log. On pourrait penser que le Singleton se prete parfaitement a ce type de fonctionnalité, seulement je me suis retrouvé face à un probleme qui est en fait une des grandes forces du Singleton, l’initialisation unique …
Je m’explique, dans mon cas j’ai besoin de pouvoir travailler avec de multiples fichiers log, si le nom du fichier est passé en parametre du constructeur, je ne pourrais travailler qu’avec celui-ci, et pour ecrire sur un nouveau fichier je devrais passer par un accesseur qui modifierait l’attribut…, ou encore je devrais passer à ma methode permettant l’ecriture du log, le nom du fichier…
-
<?php
-
// via le constructeur
-
$o->log (“Une chaine inscrite dans le fichier ‘file.log’”);
-
$o->setFileLog (‘file2.log’);
-
$o->log (“Une chaine inscrite dans le fichier ‘file2.log’”);
-
-
// via la methode log
-
$o->log (‘file.log’, “Une chaine inscrite dans le fichier ‘file.log’”);
-
?>
Ces deux methodes ne me plaisent pas particulierement, pour résoudre le probleme l’idée est de modifier le Singleton pour qu’il enregistre non pas une, mais de multiples instances de notre classe.
Donc si l’instance de la classe n’est pas déjà créée, il en crée une nouvelle,l’enregistre dans un tableau et la retourne, si celle-ci est dejà créée il la retourne simplement.
-
class SingletonMulti
-
{
-
/**
-
* array with all instances
-
*/
-
-
/**
-
* all arguments …
-
*/
-
private $args;
-
-
{
-
self::$_instances[$key] = new SinletonMulti ($args);
-
return self::$_instances[$key];
-
}
-
-
private __construct ($args)
-
{
-
$this->args = $args;
-
}
-
}
On sort peut être un peu du principe du Singleton, néanmoins l’esprit et les avantages y sont toujours (;
Tableau de bord




22 septembre 2007 at 18:24
Un Multiton, quoi ;)
22 septembre 2007 at 19:03
Excellent Tonio, merci ( ;
J’avoue que je ne connaissais pas ce pattern, cela aurait évité que je passe la soirée d’hier à trouver une solution à mon problÚme !
24 septembre 2007 at 5:07
En fait, c’est un pattern registry que tu as mis en Å?uvre. Je te conseille la lecture de l’excellent « Guide to PHP Design Pattern » ISBN 0-9735898-2-5.
24 septembre 2007 at 11:21
Salut Mickael,
Il est vrai que cela ressemble à un Registry, mais ce n’est pas exactement ça,
le Registry est un conteneur d’objets (tout type d’objets).
jettes un oiel sur un de mes précédents articles (;
http://sahid.funraill.org/2007/03/19/pattern-service-locator-ou-registry-en-php5/
sahid