Čitatelia ako vy pomáhajú podporovať MUO. Keď uskutočníte nákup pomocou odkazov na našej stránke, môžeme získať pridruženú províziu. Čítaj viac.

Továrenský (alebo výrobný spôsob) návrhový vzor sa špecializuje na delegovanie a zapuzdrenie. Tento vzor umožňuje nadtriede odložiť inštanciáciu na podtriedy. Je to preto, že trieda, ktorá obsahuje vzor primárnej továrenskej metódy, je abstraktná.

Pôvodná verzia továrenskej metódy má podobu neimplementovanej metódy, pretože nepozná produkt, ktorý vytvorí. Továrenská metóda môže vedieť, že vytvára nejaký produkt, ale nepozná špecifické vlastnosti produktu, ktorý vytvorí. Tieto znalosti sú dostupné len pre príslušné podtriedy. Zodpovednosť za implementáciu továrenskej metódy a vytvorenie vhodných objektov je preto výlučne podtriedou.

Implementácia Factory Design Pattern v Jave

Tento článok využíva vzorovú aplikáciu na generovanie spätnej väzby. Táto aplikácia využíva rôzne typy spätnej väzby, ktorú spoločnosť dostáva (na nové občerstvenie), na vytváranie špecifických správ (pomocou továrenskej metódy). Preto továrenský vzor vytvorí špecifickú spätnú väzbu (alebo správu so spätnou väzbou), pričom ako základ použije nasledujúcu primárnu triedu produktov:

instagram viewer

verejnostiabstraktnétriedaSpätná väzba{

súkromné Reťazec meno recenzenta;
súkromné Reťazec reviewMessage;
súkromnéint hodnotenie hodnotenia;

verejnostiSpätná väzba(String reviewerName, String reviewMessage, int hodnotenie hodnotenia){
toto.meno recenzenta = meno recenzenta;
toto.reviewMessage = reviewMessage;
toto.reviewRatings = hodnotenie hodnotenia;
}

verejnosti Reťazec getReviewerName(){
vrátiť meno recenzenta;
}
verejnostineplatnésetReviewerName(meno recenzenta reťazca){
toto.meno recenzenta = meno recenzenta;
}
verejnosti Reťazec getReviewMessage(){
vrátiť reviewMessage;
}
verejnostineplatnésetReviewMessage(String reviewMessage){
toto.reviewMessage = reviewMessage;
}
verejnostiintgetReviewRatings(){
vrátiť hodnotenie hodnotenia;
}
verejnostineplatnésetReviewRatings(int hodnotenie hodnotenia){
toto.reviewRatings = hodnotenie hodnotenia;
}
}

Každá spätná väzba bude mať tri povinné vlastnosti, meno recenzenta, správu o recenzii a číslo hodnotenia (od jednej do päť) pre nový snack. Rôzne typy spätnej väzby, ktoré spoločnosť dostane, budú pochádzať z jedného z troch kanálov:

E-mailová trieda spätnej väzby

verejnostitriedaEmailová spätná väzbapredlžujeSpätná väzba{

súkromné Reťazec e-mail recenzenta;

verejný email spätná väzba(Reťazec meno recenzenta, Reťazec reviewMessage, int reviewHodnotenia, Reťazec e-mail recenzenta) {
Super(meno recenzenta, správa o recenzii, hodnotenie hodnotenia);
toto.reviewerEmail = reviewerEmail;
}
verejnosti Reťazec getReviewerEmail(){
vrátiť e-mail recenzenta;
}
verejnostineplatnésetReviewerEmail(E-mail recenzenta reťazca){
toto.reviewerEmail = reviewerEmail;
}
}

E-mailová spätná väzba

verejnostitriedaMailFeedbackpredlžujeSpätná väzba{

súkromné Reťazec spiatočná adresa;

public MailFeedback(Reťazec meno recenzenta, Reťazec reviewMessage, int reviewHodnotenia, Reťazec spiatočná adresa) {
Super(meno recenzenta, správa o recenzii, hodnotenie hodnotenia);
toto.returnAddress = returnAddress;
}

verejnosti Reťazec getReturnAddress(){
vrátiť spiatočná adresa;
}

verejnostineplatnésetReturnAddress(Reťazec returnAddress){
toto.returnAddress = returnAddress;
}
}

Trieda spätnej väzby na sociálne médiá

verejnostitriedaSocialMediaFeedbackpredlžujeSpätná väzba{

súkromné Reťazec recenzentHandle;

public SocialMediaFeedback(Reťazec meno recenzenta, Reťazec reviewMessage, int reviewHodnotenia, Reťazec reviewerHandle) {
Super(meno recenzenta, správa o recenzii, hodnotenie hodnotenia);
toto.reviewerHandle = reviewerHandle;
}

verejnosti Reťazec getReviewerHandle(){
vrátiť recenzentHandle;
}

verejnostineplatnésetReviewerHandle(Handle recenzenta reťazca){
toto.reviewerHandle = reviewerHandle;
}
}

Všimnete si, že každá podtrieda spätnej väzby má jedinečnú vlastnosť. To znamená, že budete musieť vytvoriť prehľad pre každý typ spätnej väzby pomocou aspoň jednej vlastnosti, ktorá je pre daný typ jedinečná.

Jednoduchá továreň

Jednoduchá továreň je populárny prístup k použitiu výrobného vzoru. Tento prístup zahŕňa zoskupenie všetkých rôznych spätných väzieb (alebo produktov) do metódy (jednoduchá továreň) a výber vhodnej spätnej väzby na základe parametra.

verejnostitriedaFeedbackReportFactory{

verejnosti Spätná väzba makeFeedback(Typ spätnej väzby reťazca){
Spätná väzba = nulový;

ak(feedbackType.equals("e-mail")) {
spätná väzba = Nový EmailFeedback();
}inakak (feedbackType.equals("mail")) {
spätná väzba = Nový MailFeedback();
}inakak (feedbackType.equals("sociálna")) {
spätná väzba = Nový SocialMediaFeedback();
}
vrátiť spätná väzba;
}
}

Jednoduchý továrenský prístup však nie je továrenským návrhovým vzorom, ani návrhovým vzorom. Ide skôr o dizajnový koncept.

Továrenská metóda

Továrenská metóda je skutočnou reprezentáciou návrhového vzoru. Pomocou továrenskej metódy, reformovaný FeedbackReportFactorytriedy Java bude teraz obsahovať nasledujúci kód:

verejnostiabstraktnétriedaFeedbackReportFactory{
verejnostiabstraktnéneplatnémakeFeedbackReport(Spätná väzba);
}

Štruktúru výrobného vzoru môžete definovať pomocou nasledujúceho diagramu tried:

Z vyššie uvedeného diagramu uvidíte, že abstraktná trieda (alebo rozhranie) bude obsahovať abstraktnú verziu továrenskej metódy. Takže konkrétne továrenské triedy, ktoré rozširujú abstraktnú triedu, implementujú továrenskú metódu pomocou vlastností, ktoré sú jedinečné pre produkt, ktorý chce vytvoriť. Mali by ste tiež poznamenať, že každá trieda konkrétnej továrne by mala vytvoriť jeden alebo viac produktov.

Vzorová aplikácia má tri súvisiace, ale jedinečné produkty. Každý typ spätnej väzby má aspoň jednu jedinečnú vlastnosť. Aplikácia teda bude musieť mať tri konkrétne továrne na výrobu každého produktu.

Továreň na e-mailovú spätnú väzbu

verejnostitriedaEmailFeedbackReportpredlžujeFeedbackReportFactory{

EmailFeedback spätná väzba;

@Prepísať
verejnostineplatnémakeFeedbackReport(Spätná väzba){

toto.feedback = (EmailFeedback) spätná väzba;

Systém.von.println("\nReportPreSpätná väzbaCezEmail" +
"\nMeno recenzenta: " +toto.feedback.getReviewerName() +
"\nSpätná väzba: " + toto.feedback.getReviewMessage() +
"\nHodnotenia: " + toto.feedback.getReviewRatings() +
"\nEmal adresa: " + toto.feedback.getReviewerEmail());
}
}

Mail Feedback Factory

verejnostitriedaMailFeedbackReportpredlžujeFeedbackReportFactory{
MailFeedback spätná väzba;

@Prepísať
verejnostineplatnémakeFeedbackReport(Spätná väzba){
toto.feedback = (MailFeedback) spätná väzba;

Systém.von.println("\nReportPreSpätná väzbaCezMail" +
"\nMeno recenzenta: " +toto.feedback.getReviewerName() +
"\nSpätná väzba: " + toto.feedback.getReviewMessage() +
"\nHodnotenia: " + toto.feedback.getReviewRatings() +
"\nPoštová adresa: " + toto.feedback.getReturnAddress());
}
}

Továreň na spätnú väzbu sociálnych médií

verejnostitriedaSocialMediaFeedbackReportpredlžujeFeedbackReportFactory{
SocialMediaFeedback spätná väzba;

@Prepísať
verejnostineplatnémakeFeedbackReport(Spätná väzba){
toto.feedback = (SocialMediaFeedback) spätná väzba;

Systém.von.println("\nReportPreSpätná väzbaCezSociálnaMédiá" +
"\nMeno recenzenta: " + toto.feedback.getReviewerName() +
"\nSpätná väzba: " + toto.feedback.getReviewMessage() +
"\nHodnotenia: " + toto.feedback.getReviewRatings() +
"\nRukoväť sociálnych médií recenzenta: " + toto.feedback.getReviewerHandle());
}
}

Testovanie vzorovej aplikácie

Teraz môžete použiť príslušné výrobné metódy na vytváranie miniatúrnych správ o spätnej väzbe prijatej z rôznych kanálov. Môžeš otestujte aplikáciu pomocou JUnitalebo môžete vytvoriť triedu ovládača:

verejnostitriedaHlavná{

verejnostistatickéneplatnéHlavná(Reťazec[] argumentov){
Spätná väzba = Nový Email Feedback("Nick", "Skvelý produkt!", 5, "[email protected]");
Spätná väzba2 = Nový MailFeedback("john", „Produkt je dobrý, ale nie niečo, čo by som kupoval pravidelne“, 4, "prvá ulica");
Spätná väzba3 = Nový SocialMediaFeedback("Jane", "To nie je pre mňa", 2, "@janey");

FeedbackReportFactory factory = Nový EmailFeedbackReport();
FeedbackReportFactory factory2 = Nový MailFeedbackReport();
FeedbackReportFactory factory3 = Nový SocialMediaFeedbackReport();

továreň.makeFeedbackReport(spätná väzba);
továreň2.makeFeedbackReport(spätná väzba2);
továreň3.makeFeedbackReport(spätná väzba3);
}

Vyššie uvedená trieda Main používa príslušné továrne na vytvorenie troch zostáv, ktoré v konzole produkujú nasledujúci výstup:

Výhody použitia výrobného vzoru dizajnu

Továrenský návrhový vzor podporuje flexibilitu návrhu, kde na vytváranie konkrétnych tried používate rozhrania (alebo abstraktné triedy). Podporuje tiež škálovateľnosť prostredníctvom polymorfizmu tým, že umožňuje novým triedam implementovať existujúce rozhranie pri rozširovaní aplikácie.

Keď používate továrenský návrhový vzor, ​​využívate dva dôležité princípy návrhu: otvorený-zatvorený a inverzia kontroly (IoC).