这个工厂方法适合我想做的事情吗?

问题描述 投票:0回答:1

这是我想要实现的目标:

  • 这是一个文本文件解析器
  • 根据第一个字符,我创建正确的解析器对象
  • 我希望使用正确的工厂模式来做到这一点
  • 你能告诉我下面的代码是否正确适合工厂模式吗?
  • 谢谢! :-)

类解析器
{
    受保护的$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") );
$解析器->解析();

php design-patterns methods factory
1个回答
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
方法),而不是在调用它时(在中间)运行时)。

© www.soinside.com 2019 - 2024. All rights reserved.