Zur Zeit bekam ich eine Entität Klasse:Welches Fabrikdesignmuster sollte ich verwenden?
public class Notification {
private NotificationType type;
private LocalDateTime sentDate;
private String message;
private String imageUrl;
private String refId;
}
Und eine ENUM:
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;
}
}
I Mitteilungen basierend auf ENUM-Wert erstellt werden soll, so kann ich eine einfache Methode in meiner Benachrichtigungsdienst erstellt:
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;
}
Wie Sie sehen können, habe ich einen generischen Parameter für verschiedene Objekte, die ich benutze, um Notification-Objekte zu initialisieren. Es funktioniert für die ersten 3 Enum-Werte, aber für QUESTION_ANSWERED Wert Neben der Übergabe eines Objekts wie in den vorherigen 3 Fällen muss ich auch einen String-Wert übergeben und die ganze Methode würde noch hässlicher aussehen als jetzt. Ich denke, ich muss Factory Design-Muster verwenden, aber ich kann wirklich nicht passen, welche für verschiedene Parameter zu verwenden. Muss ich mit Methoden einfache Fabrik Schnittstelle erstellen wie createNotificationForInvitation, createNotificationForQuestionAnswered usw. für jeden Enum-Wert mit diffrent Parameter und alle von ihnen werden zurückkehren Mitteilung Objekte? Wie lässt man es schöner aussehen? :)
Sie sind Generika schlecht verwenden. Sie sollten 'obj' nicht auf die korrekte Klasse anwenden. Wahrscheinlich möchten Sie [* method overloading *] (https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html) verwenden. – Michael
Ok, also kann ich 'createNotification' Methode vom Benachrichtigungsdienst entfernen und dann sollte ich eine Schnittstelle mit 4 Methoden für jeden enum Wert erstellen, der spezifische' obj' Typen nimmt? Auch für diese Schnittstelle eine Implementierung, die grundsätzlich dieselben "Notification" -Objekte zurückgeben würde? – scof93
Mögliches Duplikat von [Factory in Java, wenn konkrete Objekte verschiedene Konstruktorparameter verwenden] (https://stackoverflow.com/questions/13885836/factory-in-java-when-concrete-objects-take- different- constructor- parameters) – Fuhrmanator