Was ist das Factory Design Pattern?
Das Entwurfsmuster Factory (oder Factory-Methode) ist auf Delegation und Kapselung spezialisiert. Dieses Muster ermöglicht es einer Oberklasse, die Instanziierung auf Unterklassen zu verschieben. Dies liegt daran, dass die Klasse, die das primäre Factory-Methodenmuster enthält, abstrakt ist.
Die ursprüngliche Version der Factory-Methode nimmt die Form einer nicht implementierten Methode an, weil sie das Produkt, das sie erzeugen wird, nicht kennt. Die Fabrikmethode weiß vielleicht, dass sie ein Produkt herstellt, aber sie kennt nicht die spezifischen Eigenschaften des Produkts, das sie herstellen wird. Dieses Wissen steht nur den jeweiligen Unterklassen zur Verfügung. Daher liegt die Verantwortung für die Implementierung der Factory-Methode und die Erstellung geeigneter Objekte ausschließlich bei einer Unterklasse.
Implementieren des Factory Design Patterns in Java
Dieser Artikel verwendet eine Beispielanwendung zur Generierung von Feedback-Berichten. Diese Anwendung verwendet die verschiedenen Arten von Rückmeldungen, die ein Unternehmen (für einen neuen Snack) erhält, um spezifische Berichte zu erstellen (unter Verwendung der Fabrikmethode). Daher erstellt das Fabrikmuster ein spezifisches Feedback (oder einen Feedback-Bericht), wobei die folgende primäre Produktklasse als Grundlage verwendet wird:
public abstract class Feedback {
private String reviewerName;
private String reviewMessage;
private int reviewRatings;
public Feedback(String reviewerName, String reviewMessage, int reviewRatings) {
this.reviewerName = reviewerName;
this.reviewMessage = reviewMessage;
this.reviewRatings = reviewRatings;
}
public String getReviewerName() {
return reviewerName;
}
public void setReviewerName(String reviewerName) {
this.reviewerName = reviewerName;
}
public String getReviewMessage() {
return reviewMessage;
}
public void setReviewMessage(String reviewMessage) {
this.reviewMessage = reviewMessage;
}
public int getReviewRatings() {
return reviewRatings;
}
public void setReviewRatings(int reviewRatings) {
this.reviewRatings = reviewRatings;
}
}
Jedes Feedback hat drei obligatorische Eigenschaften, einen Prüfernamen, eine Bewertungsnachricht und eine Zahlenbewertung (von eins bis fünf) für den neuen Snack. Die verschiedenen Arten von Feedback, die das Unternehmen erhält, stammen aus einem von drei Kanälen:
E-Mail-Feedback-Klasse
public class EmailFeedback extends Feedback {
private String reviewerEmail;
public EmailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerEmail) {
super(reviewerName, reviewMessage, reviewRatings);
this.reviewerEmail = reviewerEmail;
}
public String getReviewerEmail() {
return reviewerEmail;
}
public void setReviewerEmail(String reviewerEmail) {
this.reviewerEmail = reviewerEmail;
}
}
Mail-Feedback-Klasse
public class MailFeedback extends Feedback {
private String returnAddress;
public MailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String returnAddress) {
super(reviewerName, reviewMessage, reviewRatings);
this.returnAddress = returnAddress;
}
public String getReturnAddress() {
return returnAddress;
}
public void setReturnAddress(String returnAddress) {
this.returnAddress = returnAddress;
}
}
Social-Media-Feedback-Klasse
public class SocialMediaFeedback extends Feedback {
private String reviewerHandle;
public SocialMediaFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerHandle) {
super(reviewerName, reviewMessage, reviewRatings);
this.reviewerHandle = reviewerHandle;
}
public String getReviewerHandle() {
return reviewerHandle;
}
public void setReviewerHandle(String reviewerHandle) {
this.reviewerHandle = reviewerHandle;
}
}
Sie werden feststellen, dass jede Feedback-Unterklasse eine einzigartige Eigenschaft hat. Das bedeutet, dass Sie den Bericht für jeden Feedback-Typ erstellen müssen, indem Sie mindestens eine Eigenschaft verwenden, die für diesen Typ eindeutig ist.
Die einfache Fabrik
Eine einfache Fabrik ist ein beliebter Ansatz zur Verwendung des Fabrikentwurfsmusters. Bei diesem Ansatz werden alle unterschiedlichen Rückmeldungen (oder Produkte) in einer Methode (der einfachen Fabrik) gruppiert und anhand eines Parameters die geeignete Rückmeldung ausgewählt.
public class FeedbackReportFactory {
public Feedback makeFeedback(String feedbackType) {
Feedback feedback = null;
if(feedbackType.equals("email")) {
feedback = new EmailFeedback();
}else if (feedbackType.equals("mail")) {
feedback = new MailFeedback();
}else if (feedbackType.equals("social")) {
feedback = new SocialMediaFeedback();
}
return feedback;
}
}
Der einfache Fabrikansatz ist jedoch weder das Fabrikentwurfsmuster noch ein Entwurfsmuster. Es ist eher ein Designkonzept.
Die Fabrikmethode
Die Factory-Methode ist die wahre Darstellung des Entwurfsmusters. Unter Verwendung der Factory-Methode enthält die reformierte FeedbackReportFactory -Java-Klasse jetzt den folgenden Code:
public abstract class FeedbackReportFactory {
public abstract void makeFeedbackReport(Feedback feedback);
}
Die Struktur des Factory-Entwurfsmusters können Sie mit folgendem Klassendiagramm definieren:
Aus dem obigen Diagramm sehen Sie, dass eine abstrakte Klasse (oder Schnittstelle) eine abstrakte Version der Factory-Methode enthält. Die konkreten Factory-Klassen, die die abstrakte Klasse erweitern, implementieren also die Factory-Methode unter Verwendung von Eigenschaften, die für das zu erstellende Produkt eindeutig sind. Sie sollten auch beachten, dass jede konkrete Fabrikklasse ein oder mehrere Produkte erstellen sollte.
Die Beispielanwendung enthält drei verwandte, aber eindeutige Produkte. Jeder Feedback-Typ hat mindestens eine eindeutige Eigenschaft. Die Anwendung muss also drei konkrete Fabriken haben, um jedes Produkt zu bauen.
E-Mail-Feedback-Fabrik
public class EmailFeedbackReport extends FeedbackReportFactory{
EmailFeedback feedback;
@Override
public void makeFeedbackReport(Feedback feedback) {
this.feedback = (EmailFeedback) feedback;
System.out.println("\nReport For Feedback Via Email"+
"\nReviewer Name: " +this.feedback.getReviewerName() +
"\nFeedback: " + this.feedback.getReviewMessage() +
"\nRatings: " + this.feedback.getReviewRatings() +
"\nEmal Address: " + this.feedback.getReviewerEmail());
}
}
Mail-Feedback-Fabrik
public class MailFeedbackReport extends FeedbackReportFactory {
MailFeedback feedback;
@Override
public void makeFeedbackReport(Feedback feedback) {
this.feedback = (MailFeedback) feedback;
System.out.println("\nReport For Feedback Via Mail"+
"\nReviewer Name: " +this.feedback.getReviewerName() +
"\nFeedback: " + this.feedback.getReviewMessage() +
"\nRatings: " + this.feedback.getReviewRatings() +
"\nMailing Address: " + this.feedback.getReturnAddress());
}
}
Social-Media-Feedback-Fabrik
public class SocialMediaFeedbackReport extends FeedbackReportFactory {
SocialMediaFeedback feedback;
@Override
public void makeFeedbackReport(Feedback feedback) {
this.feedback = (SocialMediaFeedback) feedback;
System.out.println("\nReport For Feedback Via Social Media"+
"\nReviewer Name: " + this.feedback.getReviewerName() +
"\nFeedback: " + this.feedback.getReviewMessage() +
"\nRatings: " + this.feedback.getReviewRatings() +
"\nReviewer Social Media Handle: " + this.feedback.getReviewerHandle());
}
}
Testen der Beispielanwendung
Jetzt können Sie die jeweiligen Fabrikmethoden verwenden, um Miniaturberichte über das Feedback zu erstellen, das Sie von den verschiedenen Kanälen erhalten. Sie können die Anwendung mit JUnit testen oder eine Treiberklasse erstellen:
public class Main {
public static void main(String[] args) {
Feedback feedback = new EmailFeedback("Nick", "Great product!", 5, "nick@email.com");
Feedback feedback2 = new MailFeedback("john", "The product is good but not something I would buy regularly", 4, "first Street");
Feedback feedback3 = new SocialMediaFeedback("Jane", "It's not for me", 2, "@janey");
FeedbackReportFactory factory = new EmailFeedbackReport();
FeedbackReportFactory factory2 = new MailFeedbackReport();
FeedbackReportFactory factory3 = new SocialMediaFeedbackReport();
factory.makeFeedbackReport(feedback);
factory2.makeFeedbackReport(feedback2);
factory3.makeFeedbackReport(feedback3);
}
Die obige Hauptklasse verwendet die jeweiligen Fabriken, um drei Berichte zu erstellen, die die folgende Ausgabe in der Konsole erzeugen:
Vorteile der Verwendung des Factory Design Patterns
Das Factory-Entwurfsmuster fördert die Entwurfsflexibilität, bei der Sie Schnittstellen (oder abstrakte Klassen) verwenden, um konkrete Klassen zu erstellen. Es fördert auch die Skalierbarkeit durch Polymorphismus, indem neuen Klassen ermöglicht wird, die vorhandene Schnittstelle zu implementieren, wenn die Anwendung erweitert wird.
Wenn Sie das Factory-Designmuster verwenden, verwenden Sie zwei wichtige Designprinzipien: Open-Closed und Inversion of Control (IoC).
Schreibe einen Kommentar