Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

Tovární (nebo tovární metoda) návrhový vzor se specializuje na delegování a zapouzdření. Tento vzor umožňuje nadtřídě odložit instanci na podtřídy. Je to proto, že třída, která obsahuje vzor primární tovární metody, je abstraktní.

Původní verze tovární metody na sebe bere podobu neimplementované metody, protože nezná produkt, který vytvoří. Tovární metoda může vědět, že vytváří nějaký produkt, ale nezná specifické vlastnosti produktu, který vytvoří. Tyto znalosti jsou dostupné pouze příslušným podtřídám. Odpovědnost za implementaci tovární metody a vytvoření vhodných objektů je tedy výhradně odpovědností podtřídy.

Implementace Factory Design Pattern v Javě

Tento článek využívá ukázkovou aplikaci pro generování zpětné vazby. Tato aplikace využívá různé typy zpětné vazby, kterou společnost dostává (na nové občerstvení), k vytváření specifických sestav (pomocí tovární metody). Proto tovární vzor vytvoří specifickou zpětnou vazbu (nebo zpětnou vazbu) s použitím následující primární třídy produktů jako základu:

instagram viewer

veřejnostabstraktnítřídaZpětná vazba{

soukromé Tětiva jméno recenzenta;
soukromé Tětiva reviewMessage;
soukroméint hodnocení hodnocení;

veřejnostZpětná vazba(String reviewerName, String reviewMessage, int hodnocení hodnocení){
tento.reviewerName = recenzent;
tento.reviewMessage = reviewMessage;
tento.reviewRatings = hodnocení hodnocení;
}

veřejnost Tětiva getReviewerName(){
vrátit se jméno recenzenta;
}
veřejnostprázdnotasetReviewerName(jméno recenzenta řetězce){
tento.reviewerName = recenzent;
}
veřejnost Tětiva getReviewMessage(){
vrátit se reviewMessage;
}
veřejnostprázdnotasetReviewMessage(String reviewMessage){
tento.reviewMessage = reviewMessage;
}
veřejnostintgetReviewRatings(){
vrátit se hodnocení hodnocení;
}
veřejnostprázdnotasetReviewRatings(int hodnocení hodnocení){
tento.reviewRatings = hodnocení hodnocení;
}
}

Každá zpětná vazba bude mít tři povinné vlastnosti, jméno recenzenta, zprávu k recenzi a číselné hodnocení (od jedné do pěti) pro nový snack. Různé typy zpětné vazby, které společnost obdrží, pocházejí z jednoho ze tří kanálů:

Třída e-mailové zpětné vazby

veřejnosttřídaEmailová zpětná vazbarozšiřujeZpětná vazba{

soukromé Tětiva e-mail recenzenta;

veřejná e-mailová zpětná vazba(Tětiva jméno recenzenta, Tětiva reviewMessage, int reviewRatings, Tětiva e-mail recenzenta) {
super(jméno recenzenta, zpráva recenze, hodnocení hodnocení);
tento.reviewerEmail = reviewerEmail;
}
veřejnost Tětiva getReviewerEmail(){
vrátit se e-mail recenzenta;
}
veřejnostprázdnotasetReviewerEmail(E-mail recenzenta řetězce){
tento.reviewerEmail = reviewerEmail;
}
}

Třída e-mailové zpětné vazby

veřejnosttřídaMailFeedbackrozšiřujeZpětná vazba{

soukromé Tětiva zpáteční adresa;

veřejná e-mailová zpětná vazba (Tětiva jméno recenzenta, Tětiva reviewMessage, int reviewRatings, Tětiva zpáteční adresa) {
super(jméno recenzenta, zpráva recenze, hodnocení hodnocení);
tento.returnAddress = returnAddress;
}

veřejnost Tětiva getReturnAddress(){
vrátit se zpáteční adresa;
}

veřejnostprázdnotasetReturnAddress(Řetězec returnAddress){
tento.returnAddress = returnAddress;
}
}

Třída zpětné vazby na sociální média

veřejnosttřídaSocialMediaFeedbackrozšiřujeZpětná vazba{

soukromé Tětiva recenzentHandle;

veřejný SocialMediaFeedback(Tětiva jméno recenzenta, Tětiva reviewMessage, int reviewRatings, Tětiva recenzentHandle) {
super(jméno recenzenta, zpráva recenze, hodnocení hodnocení);
tento.reviewerHandle = reviewerHandle;
}

veřejnost Tětiva getReviewerHandle(){
vrátit se recenzentHandle;
}

veřejnostprázdnotasetReviewerHandle(Handle recenzenta řetězce){
tento.reviewerHandle = reviewerHandle;
}
}

Všimnete si, že každá podtřída zpětné vazby má jedinečnou vlastnost. To znamená, že budete muset vytvořit sestavu pro každý typ zpětné vazby pomocí alespoň jedné vlastnosti, která je pro daný typ jedinečná.

Jednoduchá továrna

Jednoduchá továrna je oblíbeným přístupem k použití továrního návrhového vzoru. Tento přístup zahrnuje seskupení všech různých zpětných vazeb (nebo produktů) do metody (jednoduchá továrna) a výběr vhodné zpětné vazby na základě parametru.

veřejnosttřídaFeedbackReportFactory{

veřejnost Zpětná vazba makeFeedback(Typ zpětné vazby řetězce){
Zpětná vazba = nula;

-li(feedbackType.equals("e-mailem")) {
zpětná vazba = Nový EmailFeedback();
}jiný-li (feedbackType.equals("pošta")) {
zpětná vazba = Nový MailFeedback();
}jiný-li (feedbackType.equals("sociální")) {
zpětná vazba = Nový SocialMediaFeedback();
}
vrátit se zpětná vazba;
}
}

Jednoduchý tovární přístup však není továrním návrhovým vzorem ani návrhovým vzorem. Je to spíše jako designový koncept.

Tovární metoda

Tovární metoda je skutečnou reprezentací návrhového vzoru. Pomocí tovární metody, reformované FeedbackReportFactorytřída Java bude nyní obsahovat následující kód:

veřejnostabstraktnítřídaFeedbackReportFactory{
veřejnostabstraktníprázdnotamakeFeedbackReport(zpětná vazba);
}

Strukturu továrního návrhového vzoru můžete definovat pomocí následujícího diagramu tříd:

Z výše uvedeného diagramu uvidíte, že abstraktní třída (nebo rozhraní) bude obsahovat abstraktní verzi tovární metody. Takže konkrétní tovární třídy, které rozšiřují abstraktní třídu, budou implementovat tovární metodu pomocí vlastností, které jsou jedinečné pro produkt, který chce vytvořit. Měli byste také poznamenat, že jakákoli konkrétní třída továrny by měla vytvořit jeden nebo více produktů.

Ukázková aplikace má tři související, ale jedinečné produkty. Každý typ zpětné vazby má alespoň jednu jedinečnou vlastnost. Aplikace tedy bude muset mít tři konkrétní továrny na výrobu každého produktu.

Továrna na e-mailovou zpětnou vazbu

veřejnosttřídaEmailFeedbackReportrozšiřujeFeedbackReportFactory{

EmailFeedback zpětná vazba;

@Přepsat
veřejnostprázdnotamakeFeedbackReport(zpětná vazba){

tento.feedback = (EmailFeedback) zpětná vazba;

Systém.ven.println("\nReportProZpětná vazbaPřesE-mailem" +
"\nJméno recenzenta: " +tento.feedback.getReviewerName() +
"\nZpětná vazba: " + tento.feedback.getReviewMessage() +
"\nHodnocení: " + tento.feedback.getReviewRatings() +
"\nEmal adresa: " + tento.feedback.getReviewerEmail());
}
}

Mail Feedback Factory

veřejnosttřídaMailFeedbackReportrozšiřujeFeedbackReportFactory{
MailFeedback zpětná vazba;

@Přepsat
veřejnostprázdnotamakeFeedbackReport(zpětná vazba){
tento.feedback = (MailFeedback) zpětná vazba;

Systém.ven.println("\nReportProZpětná vazbaPřesPošta" +
"\nJméno recenzenta: " +tento.feedback.getReviewerName() +
"\nZpětná vazba: " + tento.feedback.getReviewMessage() +
"\nHodnocení: " + tento.feedback.getReviewRatings() +
"\nPoštovní adresa: " + tento.feedback.getReturnAddress());
}
}

Továrna na zpětnou vazbu sociálních médií

veřejnosttřídaSocialMediaFeedbackReportrozšiřujeFeedbackReportFactory{
SocialMediaFeedback zpětná vazba;

@Přepsat
veřejnostprázdnotamakeFeedbackReport(zpětná vazba){
tento.feedback = (SocialMediaFeedback) zpětná vazba;

Systém.ven.println("\nReportProZpětná vazbaPřesSociálníMédia" +
"\nJméno recenzenta: " + tento.feedback.getReviewerName() +
"\nZpětná vazba: " + tento.feedback.getReviewMessage() +
"\nHodnocení: " + tento.feedback.getReviewRatings() +
"\nPopis sociálních médií recenzenta: " + tento.feedback.getReviewerHandle());
}
}

Testování ukázkové aplikace

Nyní můžete pomocí příslušných továrních metod vytvářet miniaturní zprávy o zpětné vazbě obdržené z různých kanálů. Můžeš otestujte aplikaci pomocí JUnit, nebo můžete vytvořit třídu ovladače:

veřejnosttřídaHlavní{

veřejnoststatickýprázdnotahlavní(Řetězec[] argumentů){
Zpětná vazba = Nový E-mailová zpětná vazba ("Nick", "Skvělý produkt!", 5, "[email protected]");
Zpětná vazba zpětná vazba2 = Nový MailFeedback("John", „Výrobek je dobrý, ale ne něco, co bych kupoval pravidelně“, 4, "první ulice");
Zpětná vazba zpětná vazba3 = Nový SocialMediaFeedback("Jane", "To není pro mě", 2, "@janey");

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

továrna.makeFeedbackReport(zpětná vazba);
továrna2.makeFeedbackReport(zpětná vazba2);
továrna 3.makeFeedbackReport(zpětná vazba3);
}

Výše uvedená třída Main používá příslušné továrny k vytvoření tří sestav, které v konzole vytvoří následující výstup:

Výhody použití továrního návrhového vzoru

Tovární návrhový vzor podporuje flexibilitu návrhu, kde k vytváření konkrétních tříd používáte rozhraní (nebo abstraktní třídy). Podporuje také škálovatelnost prostřednictvím polymorfismu tím, že umožňuje novým třídám implementovat stávající rozhraní při rozšiřování aplikace.

Když používáte tovární návrhový vzor, ​​využíváte dva důležité principy návrhu: Otevřený-uzavřený a Inverze řízení (IoC).