2017-11-06 4 views
0

팩토리 패턴을 코딩 할 수 있습니까? 추상 클래스를 사용하면됩니까?추상 클래스의 팩토리 패턴 사용

예를 들어 전자 메일을 파싱 중이며 전자 메일 유형은 여러 가지이며 각 전자 메일 유형마다 자체 파서 클래스가 있으며 모든 파서 클래스는 몇 가지 공통 코드가있는 기본 추상 파서 클래스를 확장합니다. 내가 공장 (EmailParserFactory)이 해당 이메일 파서
건을 얻기 위해 전화를 서버에서 읽어 각 이메일에 대한

공장 패턴으로 공장이 고전 자바 공장 패턴 (공통 인터페이스에 의존한다는 것이다 " 모양 "인터페이스입니다)
Factory UML
내 예제에서는 내 기본 파서에서 몇 가지 일반적인 논리를 유지하고 그래서 나는 그것을 추상 클래스가 필요합니다.

공장 패턴이 올바른 방법인지 잘 모릅니다.

EmailParser parser EmailParserFactory.getAppropriateEmailParser(email) ; 
ParsedEmail = parser.getParsedEmail(email) -- parser is already the appropriate parser, sending it the email message will get back a parsed object. 

객체 :

나는 다음과 함께했다 현재 디자인

 EmailParserFactory 
     private getEmailType(emailMessage) -- will check email type 
                - if email subject contains feedback its a feedback email 
                - if the email contains GUID then its a reply email etc 

    EmailParser   - abstract class 
     getBodyText() - common for all 

     ComplaintEmailParser - specific parser for Complaint Email 
     parseEmail() 
     FeedbackEmailParser - specific parser for Feedback Email 
     parseEmail() 
     ReplyEmailParser - specific parser for Reply Email 
     parseEmail() 
+1

나는 당신이 묻는 바를 정확히 따르지 않습니다. 당신은 일할 수있는 고안된 건축물을 가지고있는 것 같습니다. 여러분의'EmailParser'가 클래스가 아닌 인터페이스가 될 것을 권하고 싶지만 현재의 모든 EmailParser 구현이 확장되는 추상 기본 클래스를 가질 수없는 이유는 없습니다. 특정 우려 사항이 있습니까? 전반적인 설계 검토 요청은 너무 광범위 할 수 있습니다. –

+1

@ user648026 -'EmailParserFactory.getAppropriateEmailParser (email)'정적 호출을 제외하고 구현은 정적 팩토리에 가깝습니다. 그러나 파싱 된 모든 전자 메일이 동일한 _type_이며 공통적으로 처리 될 수있는 경우 팩터 리 메서드 인 getEmailParser()를 사용하여 팩터 리 메서드에 대한 최상의 사용 사례로, 추상 EmailProcessor (일반 처리 코드 포함)로 작성자, 구체 작성자를 SpecificEmailParser로 사용합니다. 유사한 질문에 대한 이전 답변을 참조하십시오 - https://stackoverflow.com/questions/46384358/what-are-the-real-benefits-of-using-the-abstract-factory-in-the-following-exampl/ 46407888 # 46407888 –

답변

2

당신은 상속 대신 구성을 사용할 수 있습니다. 사실 당신은 파서와 관련이없는 메소드 getBodyText()을 가지고 있습니다. 따라서 이것을 BodyTextExtractor으로 추출하여 추출기를 모든 파서에 주입 할 수 있습니다. 그런 다음 리팩토링 EmailParser은 하나의 메서드 (SRP)로 인터페이스로 변환됩니다.