2010-11-26 61 views
1


Voici ce que I'am essayer d'atteindre:
- ce un analyseur de fichier texte
- en fonction des premiers caractères que je crée l'objet analyseur correct
- Je veux le faire en utilisant le modèle d'usine droite
- pourriez-vous me dire si mon code ci-dessous correspond correctement au modèle d'usine?
- Merci! :-)

Cette méthode d'usine est-elle la bonne pour ce que j'essaie de faire?

 
class Parser 
{ 
    protected $src; 

    public function __construct($src) 
    { 
     $this->src = $src; 
    } 
} 

class Format1Parser extends Parser 
{ 
    public function Parse() 
    { 
     // Parsing format 1 
     // ... 
    } 
} 

class Format2Parser extends Parser 
{ 
    public function Parse() 
    { 
     // Parsing format 2 
     // ... 
    } 
} 

class ParserFactory 
{ 
    public static function GetParser($src) 
    { 
     $header = substr($src,0,7); 
     if ($header == "format1") 
     { 
      return(new Format1Parser($src)); 
     } 
     if ($header == "format2") 
     { 
      return(new Format2Parser($src)); 
     } 
     return(false); 
    } 
} 

$parser = ParserFactory::GetParser(file_get_contents("file.txt")); 
$parser->Parse(); 

Répondre

1

D'abord, je voudrais utiliser un suffixe (Parser_Format1) au lieu d'un préfixe (Format1Parser), car à mon humble avis, il est plus clair.

En ce qui concerne la méthode de l'usine elle-même, vous pouvez utiliser instanciation dynamique:

class ParserFactory { 
    static public function getParser($src) { 
     // may want to change the following line, because it assumes your parser 
     // type is always 7 characters long. 
     $type = substr($src, 0, 7); 

     $pattern = 'Parser_%type'; 
     $className = str_replace('%type', $type, $pattern); 
     if (!class_exists($className)) { 
     throw new InvalidArgumentException("Invalid parser $type"); 

     return new $className; 
    } 
} 

Une autre chose, votre Parser classe doit être abstraite et définir une fonction abstraite Parse():

abstract class Parser { 
    protected $src; 

    public function __construct($src) 
    { 
     $this->src = $src; 
    } 

    abstract public function Parse(); 
} 

Définition les méthodes abstraites dans une classe abstraite de base garantissent que la plupart des erreurs (ie: une méthode Parse manquante) sont interceptées lorsque la classe est analysée (au début du programme), comme suit: pposé quant à quand il est appelé (au milieu de l'exécution).

+0

Merci pour votre réponse. En effet, le code est meilleur que vous l'avez fait. Mais ma question n'était pas bonne. Le bon est "est-ce que mon code correspond correctement au modèle de méthode d'usine?", Et "est-ce qu'il y a un meilleur modèle pour faire ceci?" – Antoine

+0

Eh bien, le but du modèle d'usine est de créer des classes d'un même type (Parser dans ce cas). Donc, votre implémentation est bonne. Comme je l'ai dit, vous devriez simplement changer votre classe 'Parser' en une classe abstraite, pour éviter les erreurs d'exécution. – netcoder