簡體   English   中英

我應該使用哪種工廠設計模式?

[英]Which factory design pattern i should use?

目前我有一個實體類:

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設計模式,但是我真的不適合使用不同數量的參數。 我是否需要為具有不同參數的每個枚舉值創建諸如createNotificationForInvitationcreateNotificationForQuestionAnswered等方法的簡單工廠接口,並且所有這些枚舉值都將返回Notification對象? 如何使它看起來更漂亮? :)

我對Factory模式是否是一個很好的選擇表示懷疑,因為除了您打開的類型之外,您還為每種類型傳遞了許多不同的參數。 它顯示了每種情況下何時必須強制轉換請求類型,設置參數並傳入構造函數。

我建議多態,正如邁克爾建議的那樣,重載您的構造函數。

假設您有一個基類BaseRequest,然后有子類,如InvitationRequest,NewOwnerRequest等。

然后,您的Notification類將如下所示:

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 
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM