【发布时间】:2011-05-16 05:09:29
【问题描述】:
这是我想要实现的目标:
- 这是一个文本文件解析器
- 根据第一个字符,我创建了正确的解析器对象
- 我希望使用正确的工厂模式
- 你能告诉我下面的代码是否符合工厂模式吗?
- 谢谢 ! :-)
【问题讨论】:
标签: php design-patterns methods factory
这是我想要实现的目标:
- 这是一个文本文件解析器
- 根据第一个字符,我创建了正确的解析器对象
- 我希望使用正确的工厂模式
- 你能告诉我下面的代码是否符合工厂模式吗?
- 谢谢 ! :-)
【问题讨论】:
标签: php design-patterns methods factory
首先,我会使用后缀 (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();
}
在基本抽象类中定义抽象方法可确保在解析类时(在程序开头)而不是在调用它时(在运行时的中间)。
【讨论】:
Parser 类更改为抽象类,以防止运行时错误。