这是我想要实现的目标:
类解析器 { 受保护的$src; 公共函数 __construct($src) { $this->src = $src; } } 类 Format1Parser 扩展了 Parser { 公共函数 Parse() { // 解析格式1 // ... } } Format2Parser 类扩展了 Parser { 公共函数 Parse() { // 解析格式2 // ... } } 解析器工厂类 { 公共静态函数 GetParser($src) { $header = substr($src,0,7); if ( $header == "format1" ) { 返回(新的Format1Parser($src)); } if ( $header == "format2" ) { 返回(新的Format2Parser($src)); } 返回(假); } } $parser = ParserFactory::GetParser( file_get_contents("file.txt") ); $解析器->解析();
首先,我会使用后缀(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
方法),而不是在调用它时(在中间)运行时)。