2017-11-07 8 views
0

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? :)

+3

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

+0

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

+0

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

Antwort

1

Ich bin skeptisch, ob Factory-Muster hier eine gute Wahl ist, da neben dem Typ, den Sie einschalten, Sie auch eine Reihe von unterschiedlichen Parametern für jeden Typ übergeben. Es wird angezeigt, wenn der Anforderungstyp umgesetzt werden muss, Parameter festgelegt und der Konstruktor für jeden Fall übergeben wird.

Ich würde Polymorphismus vorschlagen und wie Michael vorgeschlagen, überladen Sie Ihren Konstruktor.

Angenommen, Sie haben eine Basisklasse BaseRequest haben und dann Unterklassen wie InvitationRequest, NewOwnerRequest usw.

dann Ihre Mitteilung Klasse würde wie folgt aussehen:

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 
    } 

} 
Verwandte Themen