Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju. Čitaj više.

Uzorak dizajna tvornice (ili tvorničke metode) specijaliziran je za delegiranje i enkapsulaciju. Ovaj obrazac omogućuje superklasi da odgodi instanciranje na podklase. To je zato što je klasa koja sadrži primarni obrazac tvorničke metode apstraktna.

Izvorna verzija tvorničke metode poprima oblik neimplementirane metode jer ne poznaje proizvod koji će stvoriti. Tvornička metoda može znati da stvara neki proizvod, ali ne zna specifične karakteristike proizvoda koji će stvoriti. Ovo znanje je dostupno samo odgovarajućim podklasama. Stoga je odgovornost za implementaciju tvorničke metode i stvaranje odgovarajućih objekata isključivo odgovornost podklase.

Implementacija obrasca dizajna tvornice u Javi

Ovaj članak koristi primjer aplikacije za generiranje izvješća s povratnim informacijama. Ova aplikacija koristi različite vrste povratnih informacija koje tvrtka prima (za novu užinu) za izradu specifičnih izvješća (koristeći tvorničku metodu). Stoga će tvornički uzorak stvoriti specifične povratne informacije (ili povratne informacije), koristeći sljedeću primarnu klasu proizvoda kao bazu:

instagram viewer

javnostsažetakrazredaPovratne informacije{

privatna Niz Ime recenzenta;
privatna Niz reviewMessage;
privatnaint reviewRatings;

javnostPovratne informacije(String reviewerName, String reviewMessage, int recenzijaOcjene){
ovaj.reviewerName = recenzentName;
ovaj.reviewMessage = poruka pregleda;
ovaj.reviewRatings = ocjene recenzija;
}

javnost Niz getReviewerName(){
povratak Ime recenzenta;
}
javnostponištitisetReviewerName(Ime recenzenta niza){
ovaj.reviewerName = recenzentName;
}
javnost Niz getReviewMessage(){
povratak reviewMessage;
}
javnostponištitisetReviewMessage(String reviewMessage){
ovaj.reviewMessage = poruka pregleda;
}
javnostintgetReviewRatings(){
povratak reviewRatings;
}
javnostponištitisetReviewRatings(int recenzijaOcjene){
ovaj.reviewRatings = ocjene recenzija;
}
}

Svaka povratna informacija imat će tri obvezna svojstva, ime recenzenta, poruku recenzije i brojčanu ocjenu (od jedan do pet) za novi snack. Različite vrste povratnih informacija koje će tvrtka dobiti dolazit će iz jednog od tri kanala:

Razred povratnih informacija putem e-pošte

javnostrazredaEmailFeedbackproteže sePovratne informacije{

privatna Niz recenzentEmail;

javna e-povratna informacija (Niz Ime recenzenta, Niz reviewMessage, int reviewRatings, Niz e-pošta recenzenta) {
super(Ime recenzenta, Poruka recenzije, Ocjene recenzije);
ovaj.reviewerEmail = recenzentEmail;
}
javnost Niz getReviewerEmail(){
povratak recenzentEmail;
}
javnostponištitisetReviewerEmail(E-pošta recenzenta niza){
ovaj.reviewerEmail = recenzentEmail;
}
}

Povratne informacije putem pošte

javnostrazredaMailFeedbackproteže sePovratne informacije{

privatna Niz Povratna adresa;

javni MailFeedback(Niz Ime recenzenta, Niz reviewMessage, int reviewRatings, Niz Povratna adresa) {
super(Ime recenzenta, Poruka recenzije, Ocjene recenzije);
ovaj.returnAddress = povratna adresa;
}

javnost Niz getReturnAddress(){
povratak Povratna adresa;
}

javnostponištitisetReturnAddress(String returnAddress){
ovaj.returnAddress = povratna adresa;
}
}

Povratne informacije društvenih medija

javnostrazredaSocialMediaFeedbackproteže sePovratne informacije{

privatna Niz recenzentHandle;

javni povratni podaci društvenih medija(Niz Ime recenzenta, Niz reviewMessage, int reviewRatings, Niz reviewerHandle) {
super(Ime recenzenta, Poruka recenzije, Ocjene recenzije);
ovaj.reviewerHandle = recenzentHandle;
}

javnost Niz getReviewerHandle(){
povratak recenzentHandle;
}

javnostponištitisetReviewerHandle(String reviewerHandle){
ovaj.reviewerHandle = recenzentHandle;
}
}

Primijetit ćete da svaka podklasa povratne informacije ima jedinstveno svojstvo. To znači da ćete morati izraditi izvješće za svaku vrstu povratne informacije koristeći barem jedno svojstvo koje je jedinstveno za tu vrstu.

Jednostavna tvornica

Jednostavna tvornica je popularan pristup korištenju uzorka dizajna tvornice. Ovaj pristup podrazumijeva grupiranje svih različitih povratnih informacija (ili proizvoda) u metodi (jednostavna tvornica) i odabir odgovarajuće povratne informacije na temelju parametra.

javnostrazredaFeedbackReportFactory{

javnost Povratne informacije makeFeedback(String feedbackType){
Povratne informacije = ništavan;

ako(feedbackType.equals("e-pošta")) {
povratna informacija = novi EmailFeedback();
}drugoako (feedbackType.equals("pošta")) {
povratna informacija = novi MailFeedback();
}drugoako (feedbackType.equals("društveni")) {
povratna informacija = novi SocialMediaFeedback();
}
povratak Povratne informacije;
}
}

Međutim, jednostavan tvornički pristup nije obrazac tvorničkog dizajna, niti je obrazac dizajna. To je više kao koncept dizajna.

Tvornička metoda

Tvornička metoda pravi je prikaz uzorka dizajna. Korištenje tvorničke metode, reformirano FeedbackReportFactoryJava klasa sad će sadržavati sljedeći kod:

javnostsažetakrazredaFeedbackReportFactory{
javnostsažetakponištitimakeFeedbackReport(Povratne informacije);
}

Možete definirati strukturu uzorka tvorničkog dizajna sa sljedećim dijagramom klasa:

Iz gornjeg dijagrama vidjet ćete da će apstraktna klasa (ili sučelje) sadržavati apstraktnu verziju tvorničke metode. Dakle, konkretne tvorničke klase koje proširuju apstraktnu klasu implementirat će tvorničku metodu, koristeći svojstva koja su jedinstvena za proizvod koji želi stvoriti. Također biste trebali imati na umu da svaka klasa betonske tvornice treba stvoriti jedan ili više proizvoda.

Uzorak prijave sadrži tri povezana, ali jedinstvena proizvoda. Svaki tip povratne informacije ima najmanje jedno jedinstveno svojstvo. Dakle, aplikacija će morati imati tri betonske tvornice za izradu svakog proizvoda.

Tvornica povratnih informacija e-poštom

javnostrazredaEmailFeedbackReportproteže seFeedbackReportFactory{

EmailFeedback povratne informacije;

@Nadjačaj
javnostponištitimakeFeedbackReport(Povratne informacije){

ovaj.feedback = (EmailFeedback) povratna informacija;

Sustav.vani.println("\nIzvješćeZaPovratne informacijePrekoE-mail" +
"\nIme recenzenta: " +ovaj.feedback.getReviewerName() +
"\nPovratne informacije: " + ovaj.feedback.getReviewMessage() +
"\nOcjene: " + ovaj.feedback.getReviewRatings() +
"\nEmal adresa: " + ovaj.feedback.getReviewerEmail());
}
}

Tvornica povratnih informacija poštom

javnostrazredaMailFeedbackReportproteže seFeedbackReportFactory{
MailFeedback povratne informacije;

@Nadjačaj
javnostponištitimakeFeedbackReport(Povratne informacije){
ovaj.feedback = (MailFeedback) povratna informacija;

Sustav.vani.println("\nIzvješćeZaPovratne informacijePrekopošta" +
"\nIme recenzenta: " +ovaj.feedback.getReviewerName() +
"\nPovratne informacije: " + ovaj.feedback.getReviewMessage() +
"\nOcjene: " + ovaj.feedback.getReviewRatings() +
"\nPoštanska adresa: " + ovaj.feedback.getReturnAddress());
}
}

Tvornica povratnih informacija društvenih medija

javnostrazredaSocialMediaFeedbackReportproteže seFeedbackReportFactory{
SocialMediaFeedback povratne informacije;

@Nadjačaj
javnostponištitimakeFeedbackReport(Povratne informacije){
ovaj.feedback = (SocialMediaFeedback) povratna informacija;

Sustav.vani.println("\nIzvješćeZaPovratne informacijePrekoDruštveniMediji" +
"\nIme recenzenta: " + ovaj.feedback.getReviewerName() +
"\nPovratne informacije: " + ovaj.feedback.getReviewMessage() +
"\nOcjene: " + ovaj.feedback.getReviewRatings() +
"\nRecenzent za društvene medije: " + ovaj.feedback.getReviewerHandle());
}
}

Testiranje uzorka aplikacije

Sada možete koristiti odgovarajuće tvorničke metode za izradu minijaturnih izvješća o povratnim informacijama primljenim s različitih kanala. Možeš testirajte aplikaciju koristeći JUnit, ili možete stvoriti klasu vozača:

javnostrazredaGlavni{

javnoststatičkiponištitiglavni(String[] argumenti){
Povratne informacije = novi Povratne informacije e-poštom("Nick", "Odličan proizvod!", 5, "[email protected]");
Povratne informacije povratne informacije2 = novi MailFeedback("Ivan", "Proizvod je dobar, ali nije nešto što bih kupovao redovito", 4, "prva ulica");
Povratne informacije povratne informacije3 = novi SocialMediaFeedback("Jane", "Nije za mene", 2, "@janey");

FeedbackReportFactory tvornica = novi Izvješće o povratnim informacijama putem e-pošte();
FeedbackReportFactory factory2 = novi MailFeedbackReport();
FeedbackReportFactory factory3 = novi SocialMediaFeedbackReport();

tvornica.makeFeedbackReport(Povratne informacije);
tvornica2.makeFeedbackReport(povratna informacija2);
tvornica3.makeFeedbackReport(povratna informacija3);
}

Gornja glavna klasa koristi odgovarajuće tvornice za stvaranje tri izvješća, proizvodeći sljedeći izlaz u konzoli:

Prednosti korištenja uzorka tvorničkog dizajna

Uzorak tvorničkog dizajna promovira fleksibilnost dizajna, gdje koristite sučelja (ili apstraktne klase) za stvaranje konkretnih klasa. Također promiče skalabilnost kroz polimorfizam, dopuštajući novim klasama da implementiraju postojeće sučelje kako se aplikacija širi.

Kada koristite tvornički obrazac dizajna, koristite dva važna principa dizajna: Otvoreno-zatvoreno i Inverzija kontrole (IoC).