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之一的一个属性,最终你会构建什么? –

相关问题