目前我有一个实体类:
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 对象?如何让它看起来更漂亮? :)
答案 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
}
}