1

업스트림에서 오는 두 가지 유형의 페이로드가 있습니다. PayloadA 또는 PayloadB입니다.단일 빌더 클래스에 여러 빌더 패턴을 갖는 방법은 무엇입니까?

PayloadA이 많은 필드는 containes :

createTimestamp 
sentTimestamp 
schemaId 
eventId 
producerId 
guid 
deviceId 
langId 
sessionId 

PayloadB이 많은 분야는 containes :

createTimestamp 
sentTimestamp 
schemaId 
eventId 
producerId 
eventType 
payloadVersion 
creationDate 
expirationSeconds 
payload 

그래서 처음 5 개 필드 사이 일반적이다. 그리고 일반적으로 그들은 더 많은 밭을 가질 것입니다.

이에 대한 스레드 안전 빌더 패턴을 작성하려고합니다. 두 페이로드의 모든 필드가 결합 된 하나의 Payload 빌더 패턴 클래스가 있어야합니까? 또는 PayloadAPayloadB 빌더 패턴 클래스를 다른 Payload 빌더 클래스에 넣고 공통 필드 인 PayloadAPayloadBPayload 클래스의 일부로 포함해야합니까?

이런 종류의 문제에 대한 빌더 패턴을 만드는 가장 좋은 방법은 무엇입니까? PayloadA 작성자 패턴 deviceId이 필수 입력란이라고 가정 해 보겠습니다. 그리고 PayloadB 작성자 패턴 eventType은 필수 입력란입니다.

+0

공통 속성을 페이로드 같은 다른 클래스로 이동하십시오. 페이로드 A와 페이로드 B에서 페이로드 클래스 구성을 사용합니다. 보세요 : http://stackoverflow.com/documentation/design-patterns/1811/builder-pattern/17177/builder-pattern-in-java-with-composition –

+0

@Ravindrababu 어떻게 보이는지 예제를 제공해 줄 수 있습니까? 처럼? 그것은 내가 더 잘 이해하는 데 도움이 될 것입니다. – john

답변

0

여기에 static nested builder (item 2) 패턴을 사용하는 것이 좋습니다.

다음은

  1. 만들기 공통 속성을 가진 abstract 클래스 Payload 만들기 무엇을 할 수 PayloadA 및 각 정적 중첩 Builder으로 Payload을 확장 PayloadB.
  2. 이러한 개체를 사용하는 방법으로 스레드 안전성을 처리 할 수 ​​있습니다 (Builder은 스레드로부터 안전 할 필요가 없습니다).

페이

public abstract class Payload { 

    private String createTimestamp; 
    private String sentTimestamp; 
    private String schemaId; 
    private String eventId; 
    private String producerId; 

    //getters, setters, equals, hashcode, toString, compareTo, etc. 
} 

PayloadA (PayloadB 유사한 것)

class PayloadA extends Payload { 
    private String guid; 
    private String deviceId; 
    private String langId; 
    private String sessionId; 

    private PayloadA() { 
     //avoid direct instantiation 
    } 

    public static class Builder { 

     private String guid; 
     private String deviceId; 
     private String langId; 
     private String sessionId; 

     public Builder setLangId(String langId) { 
      this.langId = langId; 
      return this; 
     } 

     public Builder(String deviceId) { 
      //validations 
      this.deviceId = deviceId; 
     } 

     public PayloadA build() { 
      //validations 
      return new PayloadA(); 
     } 

     //other setters returning this Builder 
    } 
} 

사용량 (상류 DA에서 해당 페이로드를 구성 타

public Payload constructPayload(final Data data) { 

    //implement any thread safety mechanism as requirdhere. 
    // synchronized is just for explanatory purposes 
    synchronized (data) { 
     if (data.getType().equals("PayloadA")) { 
      return new PayloadA.Builder(data.getDeviceId()) 
        //.setGuid("someGuid") 
        //other setters 
        .build(); 
     } else { 
      return new PayloadB.Builder(data.getEventType()) 
        //.setCreationDate("someCreationDate") 
        // other setters 
        .build(); 
     } 
    } 
} 

희망이 도움이됩니다.

+0

이것은 꽤 유망 해 보입니다.이제 페이로드 클래스에 필드가 있는지 여부에 관계없이 PayloadA 또는 PayloadB 클래스의 일부 필드에서 파생 기반을 가져옵니다. 우리가 어떻게 할 것인가? 이것은 하나의 커다란 빌더 패턴 인 Payload 클래스를 만든 다음 생성자에서 해당 필드가 설정되었는지 여부와 그 변수의 값을 파생 한 기초를 확인할 수있는 경우 가능합니다. – john

+0

부모 클래스의 필드가 부모 및/또는 하위 클래스의 다른 필드를 기반으로 파생 된 경우 이러한 '기타'필드의 설정자는 호출 될 때 부모 필드 값을 업데이트 할 수 있습니다. –

+0

@david 하나의 큰 건축업자와 관련된 문제는 PayloadA와 PayloadB 중 하나의 속성을 설정하면 결국 무엇이 구축 될 것인가? –