2010-11-26 4 views
1


무엇을 달성하려고 I'am :
-이 텍스트 파일 파서
- 첫 번째 문자에 따라 내가
올바른 파서 객체를 생성 - 내가 바로 공장 패턴
를 사용하여 그렇게 할 - 내 코드가 공장 패턴과 정확히 일치하는지 알려주시겠습니까?
- 감사합니다. 이럴가 명확 때문에 :-)

이 공장 방법은 내가 시도한 것을 위해 좋은 것입니까? 여기

 
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 메소드)가 o 그것이 호출 될 때 (런타임의 중간에) 포즈를 취한다.

+0

답장을 보내 주셔서 감사합니다. 사실, 코드는 당신이했던 것처럼 더 낫습니다. 그러나 제 질문은 좋지 않았습니다. 좋은 방법은 "내 코드가 팩토리 메서드 패턴에 올바르게 맞습니까?"및 "이 작업을 수행하는 데 더 좋은 패턴이 있습니까?" – Antoine

+0

글쎄, 팩토리 패턴의 목적은 같은 타입 (이 경우 파서)의 클래스를 만드는 것이다. 따라서 구현이 좋습니다. 앞서 말한 것처럼 런타임 오류를 방지하기 위해'Parser' 클래스를 abstract 클래스로 변경해야합니다. – netcoder

관련 문제