Является ли этот фабричный метод хорошим для того, что я пытаюсь сделать? - PullRequest
1 голос
/ 26 ноября 2010


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

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 Ответ

1 голос
/ 26 ноября 2010

Во-первых, я бы использовал суффикс (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), когда класс анализируется (в начале программы), в отличие от того, когда он вызывается (в середине времени выполнения).

...