2017-09-09 5 views
0

이것은 내 문제입니다 : 두 가지 가능한 방법 중 하나를 사용하여 특정 유형의 메시지를 처리 ​​할 수있는 Java 라이브러리를 작성 중입니다.하지만 잠재적으로 클라이언트가 다른 처리 방법을 추가 할 수 있습니다. 나는 전략 패턴에 따라, 다음과 같은 클래스를 만들었습니다 : "MessageTypeOne : ProcessorOne, MessageTypeTwo을 :팩토리 패턴을 사용하여 구성에서 읽은 개체를 인스턴스화하는 방법은 무엇입니까?

interface Processor { 
     Message processMessage(); 
    } 

    class ProcessorOne<M extends Message> implements Processor{ 
     M processMessage(){ //do stuff } 
    } 

    class ProcessorTwo<M extends Message> implements Processor{ 
     M processMessage(){ //do other stuff } 
    } 

    abstract class Message{ 
    } 

    //example 
    class MessageTypeOne extends Message{ 
    } 
    //example 
    class MessageTypeTwo extends Message{ 
    } 

이제 클라이언트는 메시지의 모든 구체적인 유형 그가 말하는 방식으로 구성을 사용 ProcessorTwo , MessageTypeThree : ProcessorOne ", MessageTypeOne 유형의 메시지가 ProcessorOne 클래스에 의해 처리되어야한다는 것을 확인합니다. 구성은 XML 파일이거나 다른 유형의 구성 일 수 있습니다. 이는 클라이언트에 달려 있습니다.

내 질문은 : 클라이언트가 구성에서 읽는 것 (자신이 선택한 구성 유형에 따라 고유 한 구문 분석 방법 사용)과 팩토리를 사용하는 구체적인 프로세서의 인스턴스화 사이에 "링크"를 만들 수있는 방법은 무엇입니까? 무늬?

미리 감사드립니다.

답변

0

나는 그것을 보관하는 것이 어렵다고 생각합니다. 팩토리 패턴을 통해 이름을 기반으로 프로세서 인스턴스를 만들 수 있지만이 두 클래스를 구성 파일에 연결할 수 없습니다. 나는 easist 방법이 귀하의 비즈니스 로직을 위해 다른 Factory를 사용하는 것이라고 생각합니다. 예를 들면 다음과 같습니다.

Map<String, String> conf = null; // What parsed from config 
    String messageType = // What you have 
    Processor processor = ProcessorFactory.createProcessor(conf.get(messageType)); 
    Message message = MessageFactory.createMessage(messageType); 
    // processing 
+0

이렇게하면 클라이언트의 책임은지도를 채우고지도의 내용을 반복하여 콘크리트 프로세서를 만드는 루프 메소드를 호출하는 것입니다. – sibly22

+0

@ sibly22 예. 프로세서 인스턴스는 맵에도 캐시 될 수 있습니다. –

+0

고맙습니다. – sibly22

관련 문제