2012-07-24 2 views
0

내 시나리오는 다음과 같습니다. 사용자가 내 소프트웨어에서 문서를 선택하면 소프트웨어가 문서에서 일부 핵심 데이터를 추출합니다. 이 소프트웨어는 두 종류의 형식을 처리합니다. PDF 및 DOCX. 이러한 각 유형에 대해 여러 가지 템플릿이 있으며 업로드 된 문서는 이러한 템플릿 중 하나에 속해야합니다. 이것이 잘 알려진 문제인지,이 시나리오를 해결할 수있는 확립 된 설계 패턴이 존재하는지는 알 수 없습니다. 여기에 제가 지금까지 설계 한 내용이 있습니다 :[어쩌면] 디자인 패턴을 찾고

각 템플릿에는 특정 구조/내용이 있으므로 각 템플릿에 대해 별도의 클래스를 만드는 것이 좋습니다. IExtractor라는 최상위 인터페이스가있을 것이며, 각각 PdfExtractor 및 DocxExtractor라고하는 두 개의 최상위 클래스가있을 것이며, 각각 IExtractor 인터페이스를 구현합니다. 모든 PDF (또는 DOCX) 템플릿에 공통적 인 기능은 이러한 부모 클래스에 포함됩니다.

아래의 두 상위 클래스에는 각 템플릿에 대해 하나씩 여러 개의 템플릿 클래스가 있습니다. 예를 들어, PdfExtractor에서 상속 한 Template571_PdfExtractor라는 클래스에는 Template 571에 고유 한 메소드가 있지만 다른 추출기와 같은 형식으로 결과가 제공됩니다.

중요한 점은 C# 4.0을 사용하고 있습니다. 여기 골격이다 :

인터페이스 :

interface IExtractor 
{ 
void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill); 
} 

두 부모 클래스 : 콘크리트 클래스의

public class DocxExtractor : IExtractor 
{ 
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill) 
    { 
    } 
} 

public class PdfExtractor : IExtractor 
{ 
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill) 
    { 
    } 
} 

하나 :

public class Template571_PdfExtractor : PdfExtractor 
{ 
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill) 
    { 
    } 
} 

지금 몇 가지 주요 질문이 있습니다 나는 잘 모르겠다. 그들 모두는 구체적인 (템플릿) 클래스의 객체를 어떻게 그리고 어디에서 인스턴스화 할 것인지 모르기 때문에 문제를 중심으로 전개됩니다. 파일 확장자를 사용하여 PdfExtractor 트리 노드 또는 DocxExtractor 노드를 내려야하는지 결정할 수 있습니다. 그 다음에는 사용자의 문서가 속한 템플릿을 알려주는 파일의 내용입니다. 그렇다면이 "결정"코드는 어디에 두어야합니까? 내 생각은 PdfExtractor 클래스 (또는 그 문제에 대한 DocxExtractor)에 넣는 것이 었습니다. 그게 올바른 방법일까요?

죄송합니다. 조금 길어서 죄송하지만 상황을 완전히 설명하는 방법을 알지 못했습니다. 당신의 아이디어에 감사드립니다. 당신이 디자인 패턴으로 깊이 파고와 같은 당신은 분명히 대부분의 시간에 뭔가를 구현하는 아무도 올바른 방법 ...이 없다는 것을 알게 될 일단

Shujaat

답변

1

한 가지 방법이 될 것이다 하나는 PdfExtractors이고 다른 하나는 DocXExtractors입니다. 각 팩토리 클래스는 아마보다 팩토리 메소드에있는 것 (즉, 어떤 템플릿을 사용하는) 반환 할 PdfExtractor 인스턴스의 구상 서브 클래스에 따라 결정

public final class PdfExtractorFactory { 
    public static PdfExtractor getExtractor(String filename) { ... } 

    ... // constructor, or singleton getter here 
} 

논리와 같은 단일 정적 방법이있을 것입니다. 이 방법은 추상 기본 클래스 인 PdfExtractor와 그 서브 클래스 모두이 결정 로직으로 어지럽 힐 수 없습니다. 팩토리 클래스 만 PdfExtractor (DocXExtractor)의 서브 클래스에 대해 알아야하고, 나머지 코드는 팩토리가 수퍼 클래스의 인스턴스를 전달하기 때문에 구체적인 서브 클래스를 전혀 알지 못합니다.

PdfExtractorFactory 및 DocXExtractorFactory 인스턴스가 하나만 필요할 것이므로 이러한 팩토리 클래스를 싱글 톤으로 구현하도록 선택할 수 있습니다.

업데이트 : 물론 당신이 (하지만 둘 필요가 없습니다)를 정적 팩토리 메소드 또는 싱글 톤 패턴과 비 정적 팩토리 메소드를 사용할 수 있습니다.

+0

감사합니다. Valentin. 그것은 참으로 도움이되었습니다. 나는 그것을 끝까지 시험해보고 더 나은 것으로 오지 않으면 대답으로 표시 할 것이다. – dotNET

+0

내가 이것을 구현하는 동안 한가지 작은 점 : 위에 표시된 것처럼 정적 메서드 대신 싱글 톤 패턴을 선택해야하는 이유가 있습니까? 적어도이 경우에는 정적 메서드가 Singleton 클래스만큼 좋지 않습니까? – dotNET

+0

더 중요한 것은, 팩토리 클래스의 GetExtractor 메소드는 pdf (또는 docx) 파일의 내용을 점검하여 그것이 속해있는 템플릿을 결정해야합니다. 다른 한편, (PDF 파일에서 내용을 읽는) 동일한 기능은 모든 구체적인 클래스에서도 필요합니다. 이러한 내용에 대한 실제 구문 분석을 수행 할 것입니다. 따라서 PdfExtractor 클래스에 ReadContents() 함수를 추가 할 계획입니다. 어떻게 팩토리 클래스가 패턴 및 객체 지향 규칙을 위반하지 않고이 함수를 사용할 것이라고 생각합니까? – dotNET

관련 문제