Lesere som deg er med på å støtte MUO. Når du foretar et kjøp ved å bruke lenker på nettstedet vårt, kan vi tjene en tilknyttet provisjon. Les mer.

Designmønsteret fra fabrikken (eller fabrikkmetoden) spesialiserer seg på delegering og innkapsling. Dette mønsteret lar en superklasse utsette instansiering til underklasser. Dette er fordi klassen som inneholder det primære fabrikkmetodemønsteret er abstrakt.

Den originale versjonen av fabrikkmetoden antar formen av en uimplementert metode fordi den ikke kjenner produktet den vil lage. Fabrikkmetoden vet kanskje at den skaper et produkt, men den kjenner ikke de spesifikke egenskapene til produktet den vil lage. Denne kunnskapen er kun tilgjengelig for de respektive underklassene. Derfor er ansvaret for å implementere fabrikkmetoden og lage passende objekter utelukkende ansvaret for en underklasse.

Implementering av fabrikkdesignmønsteret i Java

Denne artikkelen bruker et eksempel på en applikasjon for generering av tilbakemeldingsrapporter. Denne applikasjonen bruker de forskjellige typene tilbakemeldinger et selskap mottar (for en ny snack) for å lage spesifikke rapporter (ved bruk av fabrikkmetoden). Derfor vil fabrikkmønsteret lage spesifikk tilbakemelding (eller tilbakemeldingsrapport), ved å bruke følgende primære produktklasse som base:

instagram viewer

offentligabstraktklasseTilbakemelding{

privat String anmeldernavn;
privat String anmeldelseMessage;
privatint vurderingRatings;

offentligTilbakemelding(String reviewerName, String reviewMessage, int vurderinger){
dette.reviewerName = anmeldernavn;
dette.reviewMessage = reviewMessage;
dette.reviewRatings = reviewRatings;
}

offentlig String getReviewerName(){
komme tilbake anmeldernavn;
}
offentligtomromsetReviewerName(String reviewerName){
dette.reviewerName = anmeldernavn;
}
offentlig String getReviewMessage(){
komme tilbake anmeldelseMessage;
}
offentligtomromsetReviewMessage(String reviewMessage){
dette.reviewMessage = reviewMessage;
}
offentligintgetReviewRatings(){
komme tilbake vurderingRatings;
}
offentligtomromsetReviewRatings(int vurderinger){
dette.reviewRatings = reviewRatings;
}
}

Hver tilbakemelding vil ha tre obligatoriske egenskaper, et anmeldernavn, en anmeldelsesmelding og en tallvurdering (fra én til fem) for den nye snacksen. De ulike typene tilbakemeldinger selskapet vil motta vil komme fra en av tre kanaler:

E-post feedback klasse

offentligklasseE-posttilbakemeldingstrekkerTilbakemelding{

privat String anmelderE-post;

offentlig e-posttilbakemelding(String anmeldernavn, String reviewMessage, int reviewRatings, String anmelder-e-post) {
super(reviewerName, reviewMessage, reviewRatings);
dette.reviewerEmail = anmelderE-post;
}
offentlig String getReviewerE-post(){
komme tilbake anmelderE-post;
}
offentligtomromsetReviewerE-post(E-post for strenganmelder){
dette.reviewerEmail = anmelderE-post;
}
}

Mail Feedback Class

offentligklasseE-posttilbakemeldingstrekkerTilbakemelding{

privat String returadresse;

offentlig MailFeedback(String anmeldernavn, String reviewMessage, int reviewRatings, String returadresse) {
super(reviewerName, reviewMessage, reviewRatings);
dette.returnAddress = returadresse;
}

offentlig String getReturnAddress(){
komme tilbake returadresse;
}

offentligtomromsetReturnAddress(String returadresse){
dette.returnAddress = returadresse;
}
}

Tilbakemeldingsklasse i sosiale medier

offentligklasseSosiale medier tilbakemeldingstrekkerTilbakemelding{

privat String anmelder Håndtak;

offentlig sosiale medier tilbakemelding(String anmeldernavn, String reviewMessage, int reviewRatings, String anmelderhåndtak) {
super(reviewerName, reviewMessage, reviewRatings);
dette.reviewerHandle = reviewerHandle;
}

offentlig String getReviewerHandle(){
komme tilbake anmelder Håndtak;
}

offentligtomromsetReviewerHandle(String reviewerHåndtak){
dette.reviewerHandle = reviewerHandle;
}
}

Du vil legge merke til at hver tilbakemeldingsunderklasse har en unik egenskap. Dette betyr at du må opprette rapporten for hver tilbakemeldingstype ved å bruke minst én egenskap som er unik for den typen.

Den enkle fabrikken

En enkel fabrikk er en populær tilnærming til å bruke fabrikkdesignmønsteret. Denne tilnærmingen innebærer å gruppere alle de forskjellige tilbakemeldingene (eller produktene) i en metode (den enkle fabrikken) og velge riktig tilbakemelding basert på en parameter.

offentligklasseFeedbackReportFactory{

offentlig Tilbakemelding gi tilbakemelding(String feedbackType){
Tilbakemelding tilbakemelding = null;

hvis(feedbackType.equals("e-post")) {
tilbakemelding = ny E-postFeedback();
}ellershvis (feedbackType.equals("post")) {
tilbakemelding = ny MailFeedback();
}ellershvis (feedbackType.equals("sosial")) {
tilbakemelding = ny SocialMediaFeedback();
}
komme tilbake tilbakemelding;
}
}

Den enkle fabrikktilnærmingen er imidlertid ikke fabrikkdesignmønsteret, og det er heller ikke et designmønster. Det er mer som et designkonsept.

Fabrikkmetoden

Fabrikkmetoden er den sanne representasjonen av designmønsteret. Ved å bruke fabrikkmetoden, den reformerte FeedbackReportFactoryJava klasse vil nå inneholde følgende kode:

offentligabstraktklasseFeedbackReportFactory{
offentligabstrakttomrommakeFeedbackReport(Tilbakemeldinger);
}

Du kan definere strukturen til fabrikkdesignmønsteret med følgende klassediagram:

Fra diagrammet ovenfor vil du se at en abstrakt klasse (eller grensesnitt) vil inneholde en abstrakt versjon av fabrikkmetoden. Så, de konkrete fabrikkklassene som utvider den abstrakte klassen vil implementere fabrikkmetoden, ved å bruke egenskaper som er unike for produktet den ønsker å lage. Du bør også merke deg at enhver betongfabrikkklasse bør lage ett eller flere produkter.

Eksempelapplikasjonen har tre relaterte, men unike produkter. Hver tilbakemeldingstype har minst én unik egenskap. Så applikasjonen må ha tre betongfabrikker for å bygge hvert produkt.

E-post Feedback Factory

offentligklasseE-posttilbakemeldingsrapportstrekkerFeedbackReportFactory{

Tilbakemelding på e-post;

@Overstyring
offentligtomrommakeFeedbackReport(Tilbakemeldinger){

dette.feedback = (e-posttilbakemelding) tilbakemelding;

System.ute.println("\nRapportereTilTilbakemeldingViaE-post" +
"\nAnmelderens navn: " +dette.feedback.getReviewerName() +
"\nTilbakemelding: " + dette.feedback.getReviewMessage() +
"\nVurderinger: " + dette.feedback.getReviewRatings() +
"\nEmal-adresse: " + dette.feedback.getReviewerEmail());
}
}

Mail Feedback Factory

offentligklasseMailFeedback-rapportstrekkerFeedbackReportFactory{
E-posttilbakemeldinger;

@Overstyring
offentligtomrommakeFeedbackReport(Tilbakemeldinger){
dette.feedback = (MailFeedback) tilbakemelding;

System.ute.println("\nRapportereTilTilbakemeldingViaPost" +
"\nAnmelderens navn: " +dette.feedback.getReviewerName() +
"\nTilbakemelding: " + dette.feedback.getReviewMessage() +
"\nVurderinger: " + dette.feedback.getReviewRatings() +
"\nPostadresse: " + dette.feedback.getReturnAddress());
}
}

Feedback Factory for sosiale medier

offentligklasseSosiale medier tilbakemeldingsrapportstrekkerFeedbackReportFactory{
Tilbakemelding på sosiale medier;

@Overstyring
offentligtomrommakeFeedbackReport(Tilbakemeldinger){
dette.feedback = (SocialMediaFeedback) tilbakemelding;

System.ute.println("\nRapportereTilTilbakemeldingViaSosialMedia" +
"\nAnmelderens navn: " + dette.feedback.getReviewerName() +
"\nTilbakemelding: " + dette.feedback.getReviewMessage() +
"\nVurderinger: " + dette.feedback.getReviewRatings() +
"\nAnmelder sosiale medier-håndtak: " + dette.feedback.getReviewerHandle());
}
}

Testing av prøveapplikasjonen

Nå kan du bruke de respektive fabrikkmetodene til å lage miniatyrrapporter om tilbakemeldingene som er mottatt fra de forskjellige kanalene. Du kan test applikasjonen med JUnit, eller du kan opprette en sjåførklasse:

offentligklasseHoved{

offentligstatisktomromhoved-(String[] args){
Tilbakemelding tilbakemelding = ny E-posttilbakemelding("Nick", "Flott produkt!", 5, "[email protected]");
Tilbakemelding tilbakemelding2 = ny E-posttilbakemelding("John", "Produktet er bra, men ikke noe jeg ville kjøpt regelmessig", 4, "første gate");
Tilbakemelding tilbakemelding3 = ny Sosiale medier tilbakemelding("Jane", "Det er ikke for meg", 2, "@janey");

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

fabrikk.makeFeedbackReport(tilbakemelding);
fabrikk 2.makeFeedbackReport(tilbakemelding2);
fabrikk3.makeFeedbackReport(tilbakemelding3);
}

Hovedklassen ovenfor bruker de respektive fabrikkene til å lage tre rapporter, og produserer følgende utdata i konsollen:

Fordeler med å bruke fabrikkdesignmønsteret

Fabrikkdesignmønsteret fremmer designfleksibilitet, der du bruker grensesnitt (eller abstrakte klasser) for å lage konkrete klasser. Det fremmer også skalerbarhet gjennom polymorfisme, ved å la nye klasser implementere det eksisterende grensesnittet etter hvert som applikasjonen utvides.

Når du bruker fabrikkdesignmønsteret, bruker du to viktige designprinsipper: Åpen-lukket og Inversion of Control (IoC).