2010-11-26 6 views
1


Вот, что I'am пытается достичь:
- это текстовый файл, анализатор
- в зависимости от первых символов создать правильный объект парсера
- Я хотел бы сделать это, используя правильный шаблон фабрики
- Не могли бы вы рассказать мне, соответствует ли мой код правильному шаблону фабрики?
- Спасибо! :-)

Является ли этот метод фабрики хорошим для того, что я пытаюсь сделать?

 
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(); 

ответ

1

Во-первых, я хотел бы использовать суффикс (Parser_Format1) вместо префикса (Format1Parser), потому что ИМХО это понятнее.

Что касается самого фабричного метода, вы можете использовать динамический экземпляр:

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; 
    } 
} 

Другого дело, ваш Parser класса должен быть абстрактным и определить абстрактную функцию Parse():

abstract class Parser { 
    protected $src; 

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

    abstract public function Parse(); 
} 

Определения абстрактные методы в базовом абстрактном классе гарантируют, что большинство ошибок (т. е. отсутствующий метод Parse) пойманы, когда класс анализируется (в начале программы), так как o что он называется (в середине времени выполнения).

+0

Благодарим вас за ответ. Действительно, код лучше, чем вы. Но мой вопрос не был хорошим. Хороший - «правильно ли мой код соответствует шаблону фабричного метода?» И «есть ли лучший образец для этого?» – Antoine 2010-11-26 14:15:29

 Смежные вопросы

  • Нет связанных вопросов^_^