1

我有兩種類型的有效載荷來自上游:它可以是PayloadAPayloadB如何在單個構建器類中使用多個構建器模式?

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建設者類和PayloadAPayloadB的共同字段將Payload類的一部分?

什麼是製造這種問題的建設者模式的最佳方式。比方說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. 具有公共屬性創建Payloadabstract
  2. 創建PayloadAPayloadB與靜態嵌套Builder每個延伸Payload
  3. 通過使用/構建這些對象的方法來處理線程安全(不需要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 
    } 
} 

用法(從上游噠構建適當的有效載荷TA

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

這看起來很有希望。現在讓我們來說說Payload類中是否有一個字段,它可以從PayloadA或PayloadB類的幾個字段派生出來,無論它們是否設置。我們將如何做到這一點?如果我們創建一個大型構建器模式Payload類,然後在構造函數中我們可以檢查該字段是否已設置,然後根據該變量派生出該值,那麼這是可能的。 – john

+0

如果父類的字段是根據父類和/或其子類的其他字段派生的,則這些「其他」字段的設置者可以在調用時更新父字段值。 –

+0

@david與一個大建設者的問題是,如果你設置PayloadA和PayloadB之一的一個屬性,最終你會構建什麼? –

相關問題