Leser wie Sie helfen, MUO zu unterstützen. Wenn Sie über Links auf unserer Website einen Kauf tätigen, erhalten wir möglicherweise eine Affiliate-Provision. Weiterlesen.

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 Fabrikmethode 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

instagram viewer

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:

öffentlichabstraktKlasseRückmeldung{

Privatgelände Schnur PrüferName;
Privatgelände Schnur reviewMessage;
Privatgeländeint BewertungBewertungen;

öffentlichRückmeldung(String reviewerName, String reviewMessage, int RezensionBewertungen){
Das.Rezensentenname = Rezensentenname;
Das.reviewMessage = Bewertungsnachricht;
Das.reviewBewertungen = BewertungBewertungen;
}

öffentlich Schnur getReviewerName(){
zurückkehren PrüferName;
}
öffentlichLeeresetReviewerName(String ReviewerName){
Das.Rezensentenname = Rezensentenname;
}
öffentlich Schnur getReviewMessage(){
zurückkehren reviewMessage;
}
öffentlichLeeresetReviewMessage(String reviewMessage){
Das.reviewMessage = Bewertungsnachricht;
}
öffentlichintgetReviewRatings(){
zurückkehren BewertungBewertungen;
}
öffentlichLeeresetReviewRatings(int RezensionBewertungen){
Das.reviewBewertungen = BewertungBewertungen;
}
}

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

öffentlichKlasseE-Mail-FeedbackerweitertRückmeldung{

Privatgelände Schnur RezensentE-Mail;

öffentliches E-Mail-Feedback (Schnur PrüferName, Schnur reviewMessage, int reviewRatings, Schnur PrüferE-Mail) {
super(ReviewerName, reviewMessage, reviewRatings);
Das.reviewerEmail = BewerterE-Mail;
}
öffentlich Schnur getReviewerE-Mail(){
zurückkehren RezensentE-Mail;
}
öffentlichLeeresetReviewerEmail(String ReviewerE-Mail){
Das.reviewerEmail = BewerterE-Mail;
}
}

Mail-Feedback-Klasse

öffentlichKlasseE-Mail-FeedbackerweitertRückmeldung{

Privatgelände Schnur Absender;

öffentliches MailFeedback(Schnur PrüferName, Schnur reviewMessage, int reviewRatings, Schnur Absender) {
super(ReviewerName, reviewMessage, reviewRatings);
Das.returnAddress = Rücksendeadresse;
}

öffentlich Schnur GetReturnAddress(){
zurückkehren Absender;
}

öffentlichLeereSetReturnAddress(String returnAddress){
Das.returnAddress = Rücksendeadresse;
}
}

Social-Media-Feedback-Klasse

öffentlichKlasseSocialMedia-FeedbackerweitertRückmeldung{

Privatgelände Schnur ReviewerHandle;

öffentliches SocialMediaFeedback(Schnur PrüferName, Schnur reviewMessage, int reviewRatings, Schnur ReviewerHandle) {
super(ReviewerName, reviewMessage, reviewRatings);
Das.reviewerHandle = PrüferHandle;
}

öffentlich Schnur getReviewerHandle(){
zurückkehren ReviewerHandle;
}

öffentlichLeeresetReviewerHandle(String reviewerHandle){
Das.reviewerHandle = PrüferHandle;
}
}

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.

öffentlichKlasseFeedbackReportFactory{

öffentlich Rückmeldung Feedback machen(String feedbackType){
Feedback Feedback = Null;

Wenn(feedbackType.equals("Email")) {
Rückmeldung = neu E-Mail-Feedback();
}andersWenn (feedbackType.equals("Mail")) {
Rückmeldung = neu MailFeedback();
}andersWenn (feedbackType.equals("Sozial")) {
Rückmeldung = neu SocialMediaFeedback();
}
zurückkehren Rückmeldung;
}
}

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 Fabrikmethode, der reformierten FeedbackReportFactoryJava-Klasse enthält nun folgenden Code:

öffentlichabstraktKlasseFeedbackReportFactory{
öffentlichabstraktLeeremakeFeedbackReport(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

öffentlichKlasseE-Mail-FeedbackBerichterweitertFeedbackReportFactory{

E-MailFeedback-Feedback;

@Überschreiben
öffentlichLeeremakeFeedbackReport(Feedback Feedback){

Das.feedback = (E-Mail-Feedback) Feedback;

System.aus.println("\nBerichtFürRückmeldungÜberEmail" +
"\nRezensentenname: " +Das.feedback.getReviewerName() +
"\nFeedback: " + Das.feedback.getReviewMessage() +
"\nBewertungen: " + Das.feedback.getReviewRatings() +
"\nE-Mail-Adresse: " + Das.feedback.getReviewerEmail());
}
}

Mail-Feedback-Fabrik

öffentlichKlasseMailFeedbackBerichterweitertFeedbackReportFactory{
MailFeedback-Feedback;

@Überschreiben
öffentlichLeeremakeFeedbackReport(Feedback Feedback){
Das.feedback = (MailFeedback) Feedback;

System.aus.println("\nBerichtFürRückmeldungÜberPost" +
"\nRezensentenname: " +Das.feedback.getReviewerName() +
"\nFeedback: " + Das.feedback.getReviewMessage() +
"\nBewertungen: " + Das.feedback.getReviewRatings() +
"\nPostanschrift: " + Das.feedback.getReturnAddress());
}
}

Social-Media-Feedback-Fabrik

öffentlichKlasseSocialMediaFeedbackBerichterweitertFeedbackReportFactory{
SocialMediaFeedback-Feedback;

@Überschreiben
öffentlichLeeremakeFeedbackReport(Feedback Feedback){
Das.feedback = (SocialMediaFeedback) Feedback;

System.aus.println("\nBerichtFürRückmeldungÜberSozialMedien" +
"\nRezensentenname: " + Das.feedback.getReviewerName() +
"\nFeedback: " + Das.feedback.getReviewMessage() +
"\nBewertungen: " + Das.feedback.getReviewRatings() +
"\nSocial-Media-Name des Rezensenten: " + Das.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. Du kannst Testen Sie die Anwendung mit JUnit, oder Sie können eine Treiberklasse erstellen:

öffentlichKlasseHauptsächlich{

öffentlichstatischLeerehauptsächlich(String[] Argumente){
Feedback Feedback = neu E-MailFeedback("nick", "Gutes Produkt!", 5, "[email protected]");
Rückmeldung feedback2 = neu E-MailFeedback("John", "Das Produkt ist gut, aber nichts, was ich regelmäßig kaufen würde", 4, "erste Straße");
Rückmeldung feedback3 = neu SocialMediaFeedback("Jane", "Es ist nicht für mich", 2, "@janey");

FeedbackReportFactory Fabrik = neu E-MailFeedbackReport();
FeedbackReportFactory factory2 = neu MailFeedbackReport();
FeedbackBerichtFabrik Fabrik3 = neu SocialMediaFeedbackReport();

Fabrik.makeFeedbackBericht(Rückmeldung);
Fabrik2.makeFeedbackBericht(Feedback2);
Fabrik3.makeFeedbackBericht(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).