这个工厂方法适合我想做的事情吗?
这是我想要实现的目标:
- 这是一个文本文件解析器
- 根据第一个字符我创建正确的解析器对象
- 我希望使用正确的工厂模式来做到这一点
- 你能告诉我下面的代码是否正确适合工厂模式吗?
- 谢谢 ! :-)
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,我将使用后缀(Parser_Format1)而不是前缀(Format1Parser),因为恕我直言,它更清晰。
至于工厂方法本身,您可以使用动态实例化:
另一件事是,您的 Parser 类应该是抽象的,并定义一个抽象函数 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:
Another thing, your Parser class should be abstract and define an abstract 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).