2010-12-01 5 views
0

Je suis désolé de ne pas avoir trouvé de titre plus descriptif. Mon problème est le suivant. Supposons que vous ayez deux classes A et B et vous savez qu'il peut parfois arriver qu'un code essaye d'instancier un objet de type A alors que ce qui est réellement nécessaire est un objet de type B. Le point est le code pour décider lequel l'un est le bon objet appartient naturellement à la classe A et non au code client.Laisser un objet décider de sa classe

javascript (ok, js n'a pas cours, mais il fait le point clair), vous pouvez simplement faire

function A() { 
    if(some_condition) { 
     return new B(); 
    } 
    //else we proceed to customize and return our object 
} 

Je veux faire quelque chose de similaire en PHP. La meilleure chose que je peux trouver est

class A { 
    private function __construct() { 
     //whatever you need to do 
    } 

    public static function getInstance() { 
     if(some_condition) { 
      return new B(); 
     } 
     else { 
      return new A(); 
     } 
    } 
} 

Le problème est que le code client aura toujours savoir que A est spécial et vous devez instancier des objets avec une méthode statique.

Existe-t-il un moyen de déléguer à A le choix du type d'objet à renvoyer de façon transparente?

Répondre

0

Malheureusement non, le meilleur je pense que vous pouvez faire est quelque chose comme:

class Decider { 

    public static function decide() { 
     if(some_condition) { 
      return "A"; 
     } 
     else { 
      return "B"; 
     } 
    } 
} 

$new_class = Decider::decide(); 

$new_object = $new_class(); 

Mais là encore c'est vraiment pas différent alors la façon dont vous en approchèrent. Je ne considérerais pas cela comme un motif de conception invalide, cependant je laisserais à une classe externe de décider plutôt que d'avoir la classe "A" ou la classe "B" pour décider en leur sein. Idéalement, vos classes devraient être encapsulées de telle sorte qu'elles ne nécessitent pas d'autres classes, à moins qu'elles ne soient des variables membres de la classe elle-même ou qu'elles soient passées dans la classe à des fins fonctionnelles.

Questions connexes