我应该使用哪种工厂设计模式?

时间:2017-11-07 10:53:39

标签: java design-patterns factory

目前我有一个实体类:

public class Notification {

   private NotificationType type;
   private LocalDateTime sentDate;
   private String message;
   private String imageUrl;
   private String refId;
}

还有一个枚举:

public enum NotificationType {

   INVITATION_TO_GROUP("INVITATION_TO_GROUP"),
   LEAVING_GROUP("LEAVING_GROUP"),
   QUESTION_ANSWERED("QUESTION_ANSWERED"),
   NEW_OWNER("NEW_OWNER");

   private String value;

   NotificationType(String value) {
       this.value = value;
   }

   @JsonValue
   public String getValue() {
       return value;
   }
}

我想根据枚举值创建通知,所以我在通知服务中创建了一个简单的方法:

public <T> Notification createNotification(NotificationType type, T obj) {

   Notification response = null;
   GroupRequest request;

   switch(type) {
       case INVITATION_TO_GROUP:
           request = ((GroupRequest) obj);
           response =  new Notification(
               NotificationType.INVITATION_TO_GROUP,
               ...
               request.getId().getUser()
           );
           break;
       case LEAVING_GROUP:
           request = ((GroupRequest) obj);
           response = new Notification(
               NotificationType.LEAVING_GROUP,
               ...
               request.getId().getGroup().getOwner()
           );
           break;
       case NEW_OWNER:
           Group group = ((Group) obj);
           response = new Notification(
               NotificationType.NEW_OWNER,
               ...
               group.getOwner()
           );
           break;
       case QUESTION_ANSWERED:
          //??
           break;
       default:
           break;
   }

   return response;
}

正如你所看到的,我有一个用于初始化Notification对象的不同对象的通用参数。它适用于前3个枚举值,但对于 QUESTION_ANSWERED 值除了传递像以前3个案例中的对象一样,我还需要传递一个String值,整个方法看起来比现在更难看。我想我需要使用Factory desing模式,但我真的不适合使用哪一个用于不同数量的参数。我是否需要为每个具有不同参数的枚举值创建简单的工厂界面,例如 createNotificationForInvitation createNotificationForQuestionAnswered 等方法,所有这些都将返回 Notification 对象?如何让它看起来更漂亮? :)

1 个答案:

答案 0 :(得分:1)

我对工厂模式在这里是否是一个好选择持怀疑态度,因为除了你打开的类型,你还为每种类型传递了一堆不同的参数。它显示何时必须转换请求类型,设置参数并传入每个案例的构造函数。

我建议使用多态,并且迈克尔建议重载你的构造函数。

假设你有一个基类BaseRequest,然后是子类,如InvitationRequest,NewOwnerRequest等。

然后你的通知类看起来像:

public class Notification {

    public Notification(InvitationRequest request) { 
        //your setting up here 
    }

    public Notification(NewOwnerRequest request) {
       ... 
    }

    public Notification(QuestionAnswered request) {
        //QuestionAnswered has the String value you wanted 
    }

}