Läsare som du hjälper till att stödja MUO. När du gör ett köp med hjälp av länkar på vår webbplats kan vi tjäna en affiliate-provision. Läs mer.

Fabrikens (eller fabriksmetoden) designmönster är specialiserat på delegering och inkapsling. Detta mönster tillåter en superklass att skjuta upp instansieringen till underklasser. Detta beror på att klassen som innehåller det primära fabriksmetodmönstret är abstrakt.

Den ursprungliga versionen av fabriksmetoden antar formen av en oimplementerad metod eftersom den inte känner till produkten som den kommer att skapa. Fabriksmetoden kanske vet att den skapar en produkt, men den känner inte till de specifika egenskaperna hos produkten den kommer att skapa. Denna kunskap är endast tillgänglig för respektive underklass. Därför är ansvaret för att implementera fabriksmetoden och skapa lämpliga objekt endast en underklass.

Implementering av Factory Design Pattern i Java

Den här artikeln använder ett exempel på en applikation för generering av feedbackrapporter. Denna applikation använder de olika typer av feedback som ett företag får (för ett nytt mellanmål) för att skapa specifika rapporter (med fabriksmetoden). Därför kommer fabriksmönstret att skapa specifik feedback (eller feedbackrapport), med följande primära produktklass som bas:

instagram viewer

offentligabstraktklassRespons{

privat Sträng recensentnamn;
privat Sträng recensionMeddelande;
privatint recensionRatings;

offentligRespons(String reviewerName, String reviewMessage, int recensionsbetyg){
detta.reviewerName = granskarnamn;
detta.reviewMessage = recensionMessage;
detta.reviewRatings = recensionRatings;
}

offentlig Sträng getReviewerName(){
lämna tillbaka recensentnamn;
}
offentligtomhetsetReviewerName(String reviewerName){
detta.reviewerName = granskarnamn;
}
offentlig Sträng getReviewMessage(){
lämna tillbaka recensionMeddelande;
}
offentligtomhetsetReviewMessage(String review Message){
detta.reviewMessage = recensionMessage;
}
offentligintgetReviewRatings(){
lämna tillbaka recensionRatings;
}
offentligtomhetsetReviewRatings(int recensionsbetyg){
detta.reviewRatings = recensionRatings;
}
}

Varje feedback kommer att ha tre obligatoriska egenskaper, ett recensentnamn, ett recensionsmeddelande och en nummerklassificering (från ett till fem) för det nya mellanmålet. De olika typerna av feedback företaget kommer att få kommer från en av tre kanaler:

E-post feedback klass

offentligklassE-postfeedbacksträcker sigRespons{

privat Sträng granskareE-post;

offentlig e-postFeedback(Sträng recensentnamn, Sträng reviewMessage, int reviewRatings, Sträng granskarens e-post) {
super(reviewerName, reviewMessage, reviewRatings);
detta.reviewerEmail = granskareEmail;
}
offentlig Sträng getReviewerEmail(){
lämna tillbaka granskareE-post;
}
offentligtomhetsetReviewerEmail(E-post för stränggranskare){
detta.reviewerEmail = granskareEmail;
}
}

Mail Feedback Klass

offentligklassMailFeedbacksträcker sigRespons{

privat Sträng returadress;

offentlig MailFeedback(Sträng recensentnamn, Sträng reviewMessage, int reviewRatings, Sträng returadress) {
super(reviewerName, reviewMessage, reviewRatings);
detta.returnAddress = returadress;
}

offentlig Sträng getReturnAddress(){
lämna tillbaka returadress;
}

offentligtomhetsetReturnAddress(Sträng returadress){
detta.returnAddress = returadress;
}
}

Feedbackklass i sociala medier

offentligklassSocialMedia Feedbacksträcker sigRespons{

privat Sträng granskareHandtag;

offentliga sociala medier feedback(Sträng recensentnamn, Sträng reviewMessage, int reviewRatings, Sträng granskareHandle) {
super(reviewerName, reviewMessage, reviewRatings);
detta.reviewerHandle = granskarHandle;
}

offentlig Sträng getReviewerHandle(){
lämna tillbaka granskareHandtag;
}

offentligtomhetsetReviewerHandle(Handtag för stränggranskare){
detta.reviewerHandle = granskarHandle;
}
}

Du kommer att märka att varje feedbackunderklass har en unik egenskap. Detta innebär att du måste skapa rapporten för varje feedbacktyp med minst en egenskap som är unik för den typen.

Den enkla fabriken

En enkel fabrik är ett populärt sätt att använda fabriksdesignmönstret. Detta tillvägagångssätt innebär att gruppera alla olika återkopplingar (eller produkter) i en metod (den enkla fabriken) och välja lämplig återkoppling baserat på en parameter.

offentligklassFeedbackReportFactory{

offentlig Respons göra feedback(String feedbackType){
Feedback feedback = null;

om(feedbackType.equals("e-post")) {
feedback = ny EmailFeedback();
}annanom (feedbackType.equals("post")) {
feedback = ny MailFeedback();
}annanom (feedbackType.equals("social")) {
feedback = ny SocialMediaFeedback();
}
lämna tillbaka respons;
}
}

Den enkla fabriksmetoden är dock inte fabriksdesignmönstret, och det är inte heller ett designmönster. Det är mer som ett designkoncept.

Fabriksmetoden

Fabriksmetoden är den sanna representationen av designmönstret. Med hjälp av fabriksmetoden, den reformerade FeedbackReportFactoryJava klass kommer nu att innehålla följande kod:

offentligabstraktklassFeedbackReportFactory{
offentligabstrakttomhetmakeFeedbackReport(Feedback feedback);
}

Du kan definiera strukturen för fabriksdesignmönstret med följande klassdiagram:

Från diagrammet ovan ser du att en abstrakt klass (eller gränssnitt) kommer att innehålla en abstrakt version av fabriksmetoden. Så, de konkreta fabriksklasserna som utökar den abstrakta klassen kommer att implementera fabriksmetoden, med hjälp av egenskaper som är unika för produkten den vill skapa. Du bör också notera att varje betongfabriksklass bör skapa en eller flera produkter.

Exempelapplikationen har tre relaterade men unika produkter. Varje feedbacktyp har minst en unik egenskap. Så applikationen kommer att behöva ha tre betongfabriker för att bygga varje produkt.

E-post Feedback Factory

offentligklassE-postfeedbackrapportsträcker sigFeedbackReportFactory{

E-postfeedback feedback;

@Åsidosätta
offentligtomhetmakeFeedbackReport(Feedback feedback){

detta.feedback = (E-postFeedback) feedback;

Systemet.ut.println("\nRapporteraFörResponsViaE-post" +
"\nRecensentens namn: " +detta.feedback.getReviewerName() +
"\nFeedback: " + detta.feedback.getReviewMessage() +
"\nBetyg: " + detta.feedback.getReviewRatings() +
"\nEmal-adress: " + detta.feedback.getReviewerEmail());
}
}

Mail Feedback Factory

offentligklassMailFeedback-rapportsträcker sigFeedbackReportFactory{
MailFeedback feedback;

@Åsidosätta
offentligtomhetmakeFeedbackReport(Feedback feedback){
detta.feedback = (MailFeedback) feedback;

Systemet.ut.println("\nRapporteraFörResponsViaPost" +
"\nRecensentens namn: " +detta.feedback.getReviewerName() +
"\nFeedback: " + detta.feedback.getReviewMessage() +
"\nBetyg: " + detta.feedback.getReviewRatings() +
"\nPostadress: " + detta.feedback.getReturnAddress());
}
}

Social Media Feedback Factory

offentligklassSocialMediaFeedback-rapportsträcker sigFeedbackReportFactory{
SocialMediaFeedback feedback;

@Åsidosätta
offentligtomhetmakeFeedbackReport(Feedback feedback){
detta.feedback = (SocialMediaFeedback) feedback;

Systemet.ut.println("\nRapporteraFörResponsViaSocialMedia" +
"\nRecensentens namn: " + detta.feedback.getReviewerName() +
"\nFeedback: " + detta.feedback.getReviewMessage() +
"\nBetyg: " + detta.feedback.getReviewRatings() +
"\nHandtag för granskare för sociala medier: " + detta.feedback.getReviewerHandle());
}
}

Testa provapplikationen

Nu kan du använda respektive fabriksmetoder för att göra miniatyrrapporter om feedbacken från de olika kanalerna. Du kan testa applikationen med JUnit, eller så kan du skapa en förarklass:

offentligklassMain{

offentligstatisktomhethuvud(String[] args){
Feedback feedback = ny E-postfeedback("Nick", "Bra produkt!", 5, "[email protected]");
Feedback feedback2 = ny MailFeedback("John", "Produkten är bra men inte något jag skulle köpa regelbundet", 4, "första gatan");
Feedback feedback3 = ny SocialMediaFeedback("Jane", "Det är inte för mig", 2, "@janey");

FeedbackReportFactory fabrik = ny EmailFeedbackReport();
FeedbackReportFactory factory2 = ny MailFeedbackReport();
FeedbackReportFactory factory3 = ny SocialMediaFeedbackReport();

fabrik.makeFeedbackReport(respons);
fabrik 2.makeFeedbackReport(feedback2);
fabrik 3.makeFeedbackReport(feedback3);
}

Huvudklassen ovan använder respektive fabrik för att skapa tre rapporter, som producerar följande utdata i konsolen:

Fördelar med att använda Factory Design Pattern

Fabriksdesignmönstret främjar designflexibilitet, där du använder gränssnitt (eller abstrakta klasser) för att skapa konkreta klasser. Det främjar också skalbarhet genom polymorfism, genom att tillåta nya klasser att implementera det befintliga gränssnittet när applikationen expanderar.

När du använder fabriksdesignmönstret använder du två viktiga designprinciper: Öppen-stängd och Inversion of Control (IoC).