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