2010-11-26 9 views
1


何を達成しようとしてI'am:
- このテキストファイルパーサー
- 最初の文字に応じて、私は
正しいパーサーオブジェクトを作成します - 私は右Factoryパターン
を使用してそうすることを望みます - 私のコードが工場パターンに正しく適合しているかどうか教えていただけますか?
- ありがとう!私見それは明確だから:-)

このファクトリメソッドは、私がしようとしているもののための良いものですか?ここで

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

答えて

1

はまず、私は、代わりに接頭辞(Format1Parser)のサフィックス(Parser_Format1)を使用します。

は、ファクトリメソッド自体については、あなたが動的なインスタンス生成使用することができます

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

別の事を、あなたのパーサクラスが抽象的で抽象的な機能Parse()定義する必要があります:定義

abstract class Parser { 
    protected $src; 

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

    abstract public function Parse(); 
} 

を基本抽象クラス内の抽象メソッドは、(プログラムの冒頭で)クラスが解析されたときに、ほとんどのエラー(つまり、欠落したParseメソッド)がキャッチされることを保証します。呼び出されたとき(実行時の途中)に呼び出されます。

+0

ありがとうございます。実際、コードはあなたのように優れています。しかし、私の質問は良くありませんでした。良いことは、「自分のコードがファクトリメソッドのパターンに正しく当てはまるのですか?」と「これを行うには良いパターンがありますか?」です。 – Antoine

+0

さて、ファクトリパターンの目的は、同じ型のクラス(この場合はパーサー)を作成することです。だからあなたの実装は良いです。私が言ったように、ランタイムエラーを防ぐために、 'Parser'クラスを抽象クラスに変更するだけです。 – netcoder

関連する問題