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

发布于 2024-10-05 03:44:39 字数 969 浏览 3 评论 0原文


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

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();

Here what I'am trying to achieve :
- this a text file parser
- depending on the first chars I create the correct parser object
- I wish to do so using the right factory pattern
- could you tell me if my code below fits correctly the factory pattern ?
- Thank you ! :-)

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();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我不在是我 2024-10-12 03:44:39

首先,我将使用后缀(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();
}

在 a 中定义抽象方法基本抽象类确保大多数错误(即:缺少 Parse 方法)在解析类时(在程序开始时)被捕获,而不是在调用它时(在程序中间)运行时)。

First, I would use a suffix (Parser_Format1) instead of a prefix (Format1Parser), because IMHO it's clearer.

As for the factory method itself, you could use dynamic instantiation:

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;
   } 
}

Another thing, your Parser class should be abstract and define an abstract function Parse():

abstract class Parser {
    protected $src;

    public function __construct($src)
    {
        $this->src = $src;
    }   

    abstract public function Parse();
}

Defining abstract methods within a base abstract class ensure that most errors (i.e.: a missing Parse method) are caught when the class is parsed (at the beginning of the program), as opposed as to when it's called (in the middle of runtime).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文