Pattern Factory et ReflectionClass ...

LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009 - 14 août 2007 à 03:04
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 14 août 2007 à 07:52
Salut à tous ...
Alors voilà mon soucis. Je dois dans une de mes classes utiliser le pattern Factory. Non pas que je sois un grand fan des motifs de conception, mais là, j'ai pas le choix ...
Du coup j'ai quelque chose comme ça :
$objInstance = Manager :: createInstance('blablabla');
A l'interiteur de la classe createInstance, bah je suis bien embêté ... En fait, j'ai trois choix :
1) Faire un gros switch/case :
function createInstance($strParameter)
{
    switch($strParameter)
    {
       case 'blablabla' :
          return new ClasseBlaBlaBla();
          break;
       case 'bliblibli :
          return new ClasseBliBliBli();
          break;
       ...
       default :
          throw new Exception('Non supporté ! ');
    }
}

2) Faire utiliser les noms de classe dynamique :
function createInstance($strParameter)

{
    $arrNomDeClasses = array
       (
          'blablabla' => 'ClasseBlaBlaBla',
          'bliblibli' => 'ClasseBliBliBli',
       ...
       );

    if(!array_key_exisits($arrNomDeClasses, $strParameter)
       throw new Exception('Non implémenté ! ');

    return new $arrNomDeClasses[$strParameter]();

}

3) Utiliser l'API de Réfléxion :
function createInstance($strParameter)


{
    $arrNomDeClasses = array

       (

          'blablabla' => 'ClasseBlaBlaBla',

          'bliblibli' => 'ClasseBliBliBli',

       ...

       );
  
    try
    {
        $objClasseDeReflexion = newReflectionClass($arrNomDeClasses[$strParameter];
    }
    catch(Exception $objException)
    {
       throw new Exception('Non supporté ! ');
    }
    return $objClasseDeReflexion -> newInstance();


}

L'avantage de la première solution, c'est qu'elle est rapide et propre, mais si un grand nombre de classe doit être pris en compte, alors ça devient un peu difficile à gérer.
La seconde et la troisième on l'avantage de pouvoir, moyennant quelques lignes de codes, de placer toutes les classes dont la génération doit être possibles et les inclure à la volée lorsqu'on en a besoin. Mais la seconde méthode est plutôt sale, et la troisième est extrêmement lente ...
Ma question est donc ... Qu'en pensez-vous ? Il est tard et j'ai pas creusé la question, mais je pense que je ne suis pas le seul à avoir eu ce problème ... Donc j'attends des réactions !
Merci !
LocalStone

1 réponse

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
14 août 2007 à 07:52
Salut

la troisieme te permet aussi d'effectuer des choses comme envoyer les arguments sous forme d'array, et appeller __construct() (enfin je crois)

<hr />une recherche sur exalead vous aurait peut-etre evite de poser cette question

In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy
0
Rejoignez-nous