2016-10-12 7 views
0

이에 대한 내부 정적 클래스없이 유창 빌더 패턴을 사용하여 내가 Passing 1 to many parameters of same object type워크 플로우

에서 일하는 내가 그 좋은 피드백을 늘어 놓던에서 연속이다, 나는 내가 디자인을 개선 믿습니다. 전체 코드는 요구 사항은 간단 https://github.com/spakai/flow_input_builder

에있다 : -

내가 이전 워크 플로우

내가 인터페이스

의 세트가 1 개 이상의 출력을 사용하여 다른 워크 플로우의 입력의 집합을 구축해야 지금
public interface SwfInput { 

} 

public interface SwfOutput { 

} 

public interface Workflow<I extends SwfInput, O extends SwfOutput> { 

    public O execute(I input); 
} 

public interface Builder<I extends SwfInput> { 
    public I build(); 

} 

는 I가 순차적으로 실행 도착 3 명 흐름을 말한다 FlowA-> FlowB-> FlowC

FlowC m은 필요 andatory FlowB 출력하지만은 임의로

는 그래서 FlowCBuilder

대한 구현을 FlowA

에서 내가 작성한
public class FlowCInputBuilder implements Builder<FlowCInput> { 

    private final FlowBOutput mandatoryflowBOutput; 
    private FlowAOutput optionalflowAOutput; 

    public FlowAOutput getOptionalflowAOutput() { 
     return optionalflowAOutput; 
    } 

    public FlowCInputBuilder setOptionalflowAOutput(FlowAOutput optionalflowAOutput) { 
     this.optionalflowAOutput = optionalflowAOutput; 
     return this; 
    } 

    public FlowCInputBuilder(FlowBOutput mandatoryflowBOutput) { 
     this.mandatoryflowBOutput = mandatoryflowBOutput; 
    } 

    @Override 
    public FlowCInput build() { 

     FlowCInput input = new FlowCInput(); 
     input.setMandatoryFromFlowB(mandatoryflowBOutput.getOutput1FromB()); 

     if (optionalflowAOutput != null) { 
      input.setOptionalFromFlowA(optionalflowAOutput.getOutput2FromA()); 
     } 

     return input;  

    } 


} 

한 시험

FlowBOutput mandatoryflowBOutput = new FlowBOutput(); 

mandatoryflowBOutput.setOutput1FromB("iNeedThis"); 
FlowAOutput optionalflowAOutput = new FlowAOutput(); 
FlowCInput input = new FlowCInputBuilder(mandatoryflowBOutput) 
       .setOptionalflowAOutput(optionalflowAOutput) 
       .build(); 

제가 사용되지 않은 사용 예를 정적 내부 클래스를 도시 빌더 패턴.

모든 의견을 환영합니다.

+0

여기에 질문이 있습니까? – scottb

+0

아, 질문은 디자인이 의미가 있는지 여부와이 작업을 수행하는 더 좋은 방법이 있는지 여부 및 빌더 패턴에서 정적 내부 클래스를 사용하지 않는 것이 맞습니까? – spakai

+0

정적 멤버 클래스는 모든 의도와 목적에 대해 최상위 클래스와 동일합니다 (패키징의 편의를 위해 방금 이동 한 것입니다). 따라서 실제 최상위 클래스를 빌더로 사용하려면 이동하십시오. 많은 사람들은 빌더가 객체를 만드는 클래스와 만 작동하기 때문에 그 클래스의 정적 멤버 클래스로 가장 잘 패키징되어 있다고 말합니다. 그러나 당신은 당신이 원하는대로 할 수 있습니다. – scottb

답변

3

정적 내부 클래스를 사용해야합니다. 이 방법을 사용하는 핵심은 내부가 직접 생성되는 개체의 사유 속성에 액세스 할 수 있다는 것입니다. 이는 빌더가 생성을위한 긴 임시 상태 목록을 유지할 필요가 없으므로 중복 된 코드를 제거하는 데 도움이됩니다. 그래서, 당신의 코드는 다음과 같이 다시 쓸 수있다 :

public class FlowCInput { 
    private int output1FromB; // suppose that it is int 
    private String output2FromA; // suppose that it is String 
    private FlowCInput() { } 
    //... 

    public static class FlowCInputBuilder implements Builder<FlowCInput> { 
     private final FlowCInput result; 

     public FlowCInputBuilder(FlowBOutput mandatoryflowBOutput) { 
      result = new FlowCInput(); 
      // output1FromB is private but still accessed from here 
      result.output1FromB = mandatoryflowBOutput.getOutput1FromB(); 
     } 

     public FlowCInputBuilder setOptionalflowAOutput(FlowAOutput optionalflowAOutput) { 
      // same for output2FromA 
      result.output2FromA = optionalflowAOutput.getOutput2FromA(); 
      return this; 
     } 

     @Override 
     public FlowCInput build() { 
      return result; 
     } 
    } 
} 

당신이보다시피, 빌더는 이제 만 FlowCInput 객체를 보유하고, 그것은 불필요하게 이전 mandatoryflowBOutputoptionalflowAOutput를 보유하지 않습니다.

관련 문제