Sahid Ferdjaoui Blog - Funraill Foundation Bienvenue, Log in - thème 2007 RC1

Powered by OpenSource Softwares

Outil de déboggage colaborative
reduire

Un Singleton multi instances…

le 22 septembre 2007 par sahid

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…

  1. <?php
  2. // via le constructeur
  3. $o = Log::singleton (‘file.log’);
  4. $o->log (“Une chaine inscrite dans le fichier ‘file.log’”);
  5. $o->setFileLog (‘file2.log’);
  6. $o->log (“Une chaine inscrite dans le fichier ‘file2.log’”);
  7.  
  8. // via la methode log
  9. $o = Log::singleton ();
  10. $o->log (‘file.log’, “Une chaine inscrite dans le fichier ‘file.log’”);
  11. ?>

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.

  1. $o = Log::singleton (‘key_file’, ‘file.log’);
  2. $o->log (“une chaine… dans ‘file.log’”);
  3.  
  4. $o = Log::singleton (‘key_file2′, ‘file2.log’);
  5. $o->log (“une chaine… dans ‘file2.log’”);

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.

  1. class SingletonMulti
  2. {
  3.   /**
  4.    * array with all instances
  5.    */
  6.   private static $_instances = array ();
  7.  
  8.   /**
  9.    * all arguments …
  10.    */
  11.   private $args;
  12.  
  13.   public static singleton ($key, $args = “null”)
  14.   {
  15.     if (!array_key_exists ($key, self::$_instances))
  16.       self::$_instances[$key] = new SinletonMulti ($args);
  17.     return self::$_instances[$key];
  18.   }
  19.  
  20.   private __construct ($args)
  21.   {
  22.     $this->args = $args;
  23.   }   
  24. }

On sort peut être un peu du principe du Singleton, néanmoins l’esprit et les avantages y sont toujours (;

4 commentaires pour Un Singleton multi instances…

  1. Tonio dit :

    Un Multiton, quoi ;)

  2. sahid dit :

    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 !

  3. Mickaël Wolff dit :

    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.

  4. sahid dit :

    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

Tu peux laisser un commentaire pour Un Singleton multi instances…