[英]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設計模式,但是我真的不適合使用不同數量的參數。 我是否需要為具有不同參數的每個枚舉值創建諸如createNotificationForInvitation , createNotificationForQuestionAnswered等方法的簡單工廠接口,並且所有這些枚舉值都將返回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.