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