Læsere som dig hjælper med at støtte MUO. Når du foretager et køb ved hjælp af links på vores websted, kan vi optjene en affiliate-kommission. Læs mere.

Fabrikkens (eller fabriksmetodens) designmønster er specialiseret i delegering og indkapsling. Dette mønster tillader en superklasse at udskyde instansiering til underklasser. Dette skyldes, at klassen, der indeholder det primære fabriksmetodemønster, er abstrakt.

Den originale version af fabriksmetoden antager form af en uimplementeret metode, fordi den ikke kender det produkt, den vil skabe. Fabriksmetoden ved måske, at den skaber et produkt, men den kender ikke de specifikke egenskaber ved det produkt, den vil skabe. Denne viden er kun tilgængelig for de respektive underklasser. Derfor er ansvaret for at implementere fabriksmetoden og skabe passende objekter udelukkende en underklasses ansvar.

Implementering af Factory Design Pattern i Java

Denne artikel bruger et eksempel på en applikation til generering af feedbackrapporter. Denne applikation bruger de forskellige typer feedback, som en virksomhed modtager (for en ny snack) til at oprette specifikke rapporter (ved hjælp af fabriksmetoden). Derfor vil fabriksmønsteret skabe specifik feedback (eller feedbackrapport) ved at bruge følgende primære produktklasse som base:

instagram viewer

offentligabstraktklasseFeedback{

privat Snor anmeldernavn;
privat Snor anmeldelseBesked;
privatint anmeldelse Bedømmelser;

offentligFeedback(String reviewerName, String reviewMessage, int anmeldelsesvurderinger){
det her.reviewerName = reviewerName;
det her.reviewMessage = reviewMessage;
det her.reviewRatings = reviewRatings;
}

offentlig Snor getReviewerName(){
Vend tilbage anmeldernavn;
}
offentligugyldigsetReviewerName(String reviewerName){
det her.reviewerName = reviewerName;
}
offentlig Snor getReviewMessage(){
Vend tilbage anmeldelseBesked;
}
offentligugyldigsetReviewMessage(String review Message){
det her.reviewMessage = reviewMessage;
}
offentligintgetReviewRatings(){
Vend tilbage anmeldelse Bedømmelser;
}
offentligugyldigsætReviewRatings(int anmeldelsesvurderinger){
det her.reviewRatings = reviewRatings;
}
}

Hver feedback vil have tre obligatoriske egenskaber, et anmeldernavn, en anmeldelsesmeddelelse og en nummervurdering (fra én til fem) for den nye snack. De forskellige typer feedback, virksomheden vil modtage, kommer fra en af ​​tre kanaler:

E-mail feedback klasse

offentligklasseEmailFeedbackstrækker sigFeedback{

privat Snor anmelderE-mail;

offentlig e-mailFeedback(Snor anmeldernavn, Snor reviewMessage, int reviewRatings, Snor anmelder-e-mail) {
super(reviewerName, reviewMessage, reviewRatings);
det her.reviewerEmail = anmelderE-mail;
}
offentlig Snor getReviewerEmail(){
Vend tilbage anmelderE-mail;
}
offentligugyldigsætReviewerE-mail(String reviewer Email){
det her.reviewerEmail = anmelderE-mail;
}
}

Mail Feedback Klasse

offentligklasseMailFeedbackstrækker sigFeedback{

privat Snor retur adresse;

offentlig MailFeedback(Snor anmeldernavn, Snor reviewMessage, int reviewRatings, Snor retur adresse) {
super(reviewerName, reviewMessage, reviewRatings);
det her.returnAddress = returnAddress;
}

offentlig Snor getReturnAddress(){
Vend tilbage retur adresse;
}

offentligugyldigsætReturadresse(String returnAddress){
det her.returnAddress = returnAddress;
}
}

Feedback klasse på sociale medier

offentligklasseSocialMedia Feedbackstrækker sigFeedback{

privat Snor anmelder Håndtag;

offentlig SocialMediaFeedback(Snor anmeldernavn, Snor reviewMessage, int reviewRatings, Snor anmelderhåndtag) {
super(reviewerName, reviewMessage, reviewRatings);
det her.reviewerHandle = reviewerHandle;
}

offentlig Snor getReviewerHandle(){
Vend tilbage anmelder Håndtag;
}

offentligugyldigsetReviewerHandle(String reviewer Handle){
det her.reviewerHandle = reviewerHandle;
}
}

Du vil bemærke, at hver feedback-underklasse har en unik egenskab. Det betyder, at du skal oprette rapporten for hver feedbacktype ved at bruge mindst én egenskab, der er unik for den pågældende type.

Den simple fabrik

En simpel fabrik er en populær tilgang til at bruge fabriksdesignmønsteret. Denne tilgang indebærer at gruppere alle de forskellige feedbacks (eller produkter) i en metode (den simple fabrik) og vælge den passende feedback baseret på en parameter.

offentligklasseFeedbackReportFactory{

offentlig Feedback give feedback(String feedbackType){
Feedback feedback = nul;

hvis(feedbackType.equals("e-mail")) {
feedback = ny EmailFeedback();
}andethvis (feedbackType.equals("post")) {
feedback = ny MailFeedback();
}andethvis (feedbackType.equals("social")) {
feedback = ny SocialMediaFeedback();
}
Vend tilbage feedback;
}
}

Den simple fabrikstilgang er dog ikke fabriksdesignmønsteret, og det er heller ikke et designmønster. Det er mere som et designkoncept.

Fabriksmetoden

Fabriksmetoden er den sande repræsentation af designmønsteret. Ved hjælp af fabriksmetoden, de reformerede FeedbackReportFactoryJava klasse vil nu indeholde følgende kode:

offentligabstraktklasseFeedbackReportFactory{
offentligabstraktugyldiglavFeedbackRapport(Feedback feedback);
}

Du kan definere strukturen af ​​fabriksdesignmønsteret med følgende klassediagram:

Fra diagrammet ovenfor vil du se, at en abstrakt klasse (eller grænseflade) vil indeholde en abstrakt version af fabriksmetoden. Så de konkrete fabriksklasser, der udvider den abstrakte klasse, vil implementere fabriksmetoden ved at bruge egenskaber, der er unikke for det produkt, den ønsker at skabe. Du skal også bemærke, at enhver betonfabriksklasse skal skabe et eller flere produkter.

Eksempelapplikationen har tre relaterede, men unikke produkter. Hver feedbacktype har mindst én unik egenskab. Så applikationen skal have tre betonfabrikker til at bygge hvert produkt.

E-mail Feedback Factory

offentligklasseEmailFeedback-rapportstrækker sigFeedbackReportFactory{

EmailFeedback feedback;

@Tilsidesæt
offentligugyldiglavFeedbackRapport(Feedback feedback){

det her.feedback = (E-mailFeedback) feedback;

System.ud.println("\nRapportérTilFeedbackViaE-mail" +
"\nAnmelderens navn: " +det her.feedback.getReviewerName() +
"\nFeedback: " + det her.feedback.getReviewMessage() +
"\nBedømmelser: " + det her.feedback.getReviewRatings() +
"\nEmal adresse: " + det her.feedback.getReviewerEmail());
}
}

Mail Feedback Factory

offentligklasseMailFeedback-rapportstrækker sigFeedbackReportFactory{
MailFeedback feedback;

@Tilsidesæt
offentligugyldiglavFeedbackRapport(Feedback feedback){
det her.feedback = (MailFeedback) feedback;

System.ud.println("\nRapportérTilFeedbackViaPost" +
"\nAnmelderens navn: " +det her.feedback.getReviewerName() +
"\nFeedback: " + det her.feedback.getReviewMessage() +
"\nBedømmelser: " + det her.feedback.getReviewRatings() +
"\nPostadresse: " + det her.feedback.getReturnAddress());
}
}

Social Media Feedback Factory

offentligklasseSocialMedia Feedback-rapportstrækker sigFeedbackReportFactory{
SocialMediaFeedback feedback;

@Tilsidesæt
offentligugyldiglavFeedbackRapport(Feedback feedback){
det her.feedback = (SocialMediaFeedback) feedback;

System.ud.println("\nRapportérTilFeedbackViaSocialMedier" +
"\nAnmelderens navn: " + det her.feedback.getReviewerName() +
"\nFeedback: " + det her.feedback.getReviewMessage() +
"\nBedømmelser: " + det her.feedback.getReviewRatings() +
"\nReviewer Social Media Håndtag: " + det her.feedback.getReviewerHandle());
}
}

Test af prøveapplikationen

Nu kan du bruge de respektive fabriksmetoder til at lave miniaturerapporter om feedback modtaget fra de forskellige kanaler. Du kan test applikationen ved hjælp af JUnit, eller du kan oprette en driverklasse:

offentligklasseHoved{

offentligstatiskugyldigvigtigste(String[] args){
Feedback feedback = ny E-mailFeedback("Nick", "Fantastisk produkt!", 5, "[email protected]");
Feedback feedback2 = ny MailFeedback("John", "Produktet er godt, men ikke noget jeg ville købe regelmæssigt", 4, "første gade");
Feedback feedback3 = ny SocialMediaFeedback("Jane", "Det er ikke for mig", 2, "@janey");

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

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

Hovedklassen ovenfor bruger de respektive fabrikker til at oprette tre rapporter, der producerer følgende output i konsollen:

Fordele ved at bruge fabriksdesignmønsteret

Fabriksdesignmønsteret fremmer designfleksibilitet, hvor du bruger grænseflader (eller abstrakte klasser) til at skabe konkrete klasser. Det fremmer også skalerbarhed gennem polymorfi ved at tillade nye klasser at implementere den eksisterende grænseflade, efterhånden som applikationen udvides.

Når du bruger fabriksdesignmønsteret, bruger du to vigtige designprincipper: Åben-lukket og Inversion of Control (IoC).