A gyári (vagy gyári módszer) tervezési minta a delegálásra és a tokozásra specializálódott. Ez a minta lehetővé teszi a szuperosztály számára, hogy elhalassza a példányosítást az alosztályokra. Ennek az az oka, hogy az elsődleges gyári metódusmintát tartalmazó osztály absztrakt.
A gyári módszer eredeti változata egy meg nem valósított metódus formáját ölti, mert nem ismeri az általa létrehozandó terméket. A gyári módszer tudhatja, hogy valamilyen terméket hoz létre, de nem ismeri az általa létrehozandó termék sajátos jellemzőit. Ez a tudás csak az adott alosztályok számára elérhető. Ezért a gyári módszer megvalósítása és a megfelelő objektumok létrehozása kizárólag egy alosztály felelőssége.
A Factory Design Pattern implementálása Java nyelven
Ez a cikk egy minta-visszajelzési jelentést készítő alkalmazást használ. Ez az alkalmazás a különböző típusú visszajelzéseket használja fel, amelyeket a vállalat kap (egy új snackhez), hogy konkrét jelentéseket készítsen (gyári módszerrel). Ezért a gyári minta konkrét visszajelzést (vagy visszajelzési jelentést) hoz létre, alapul véve a következő elsődleges termékosztályt:
nyilvánosabsztraktosztályVisszacsatolás{
magán Húr lektorName;
magán Húr felülvizsgálatÜzenet;
magánint értékelés Értékelések;
nyilvánosVisszacsatolás(String reviewerName, String reviewMessage, int értékelés Értékelések){
ez.reviewerName = értékelőNév;
ez.reviewMessage = reviewMessage;
ez.reviewRatings = reviewRatings;
}
nyilvános Húr getReviewerName(){
Visszatérés lektorName;
}
nyilvánosüressetReviewerName(String reviewerName){
ez.reviewerName = értékelőNév;
}
nyilvános Húr getReviewMessage(){
Visszatérés felülvizsgálatÜzenet;
}
nyilvánosüressetReviewMessage(String reviewMessage){
ez.reviewMessage = reviewMessage;
}
nyilvánosintgetReviewRatings(){
Visszatérés értékelés Értékelések;
}
nyilvánosüressetReviewRatings(int értékelés Értékelések){
ez.reviewRatings = reviewRatings;
}
}
Minden visszajelzésnek három kötelező tulajdonsága van, egy értékelő neve, egy véleményező üzenet és egy szám szerinti értékelés (egytől ötig) az új snackhez. A különböző típusú visszajelzések, amelyeket a vállalat kap, a következő három csatorna egyikéről érkeznek:
E-mail visszajelzés osztály
nyilvánososztályE-mail VisszajelzéskiterjedVisszacsatolás{
magán Húr értékelőE-mail;
nyilvános e-mail visszajelzés(Húr értékelőNév, Húr felülvizsgálatÜzenet, int reviewÉrtékelések, Húr értékelőEmail) {
szuper(reviewerName, reviewMessage, reviewRatings);
ez.reviewerEmail = felülvizsgálóEmail;
}
nyilvános Húr getReviewerEmail(){
Visszatérés értékelőE-mail;
}
nyilvánosüressetReviewerEmail(Karakterlánc-ellenőr e-mail){
ez.reviewerEmail = felülvizsgálóEmail;
}
}
Mail Visszajelzés osztály
nyilvánososztályMailFeedbackkiterjedVisszacsatolás{
magán Húr visszaszállítási cím;
nyilvános levélvisszajelzés(Húr értékelőNév, Húr felülvizsgálatÜzenet, int reviewÉrtékelések, Húr visszaszállítási cím) {
szuper(reviewerName, reviewMessage, reviewRatings);
ez.returnAddress = returnAddress;
}nyilvános Húr getReturnAddress(){
Visszatérés visszaszállítási cím;
}
nyilvánosüressetReturnAddress(String returnAddress){
ez.returnAddress = returnAddress;
}
}
Social Media Feedback Class
nyilvánososztálySocialMediaFeedbackkiterjedVisszacsatolás{
magán Húr recenzensHandle;
nyilvános SocialMediaFeedback(Húr értékelőNév, Húr felülvizsgálatÜzenet, int reviewÉrtékelések, Húr reviewerHandle) {
szuper(reviewerName, reviewMessage, reviewRatings);
ez.reviewerHandle = reviewerHandle;
}
nyilvános Húr getReviewerHandle(){
Visszatérés recenzensHandle;
}
nyilvánosüressetReviewerHandle(String reviewerHandle){
ez.reviewerHandle = reviewerHandle;
}
}
Észre fogja venni, hogy minden visszajelzési alosztálynak egyedi tulajdonsága van. Ez azt jelenti, hogy minden visszajelzéstípushoz létre kell hoznia a jelentést legalább egy, az adott típusra egyedi tulajdonság használatával.
Az egyszerű gyár
Az egyszerű gyár népszerű megközelítése a gyári tervezési minta használatának. Ez a megközelítés magában foglalja az összes különböző visszacsatolás (vagy termék) csoportosítását egy módszerben (az egyszerű gyárban), és a megfelelő visszacsatolás kiválasztását egy paraméter alapján.
nyilvánososztályFeedbackReportFactory{
nyilvános Visszacsatolás visszajelzést(Karakterlánc-visszajelzés típusa){
Visszajelzés = nulla;
ha(feedbackType.equals("email")) {
visszajelzés = új EmailFeedback();
}másha (feedbackType.equals("levél")) {
visszajelzés = új MailFeedback();
}másha (feedbackType.equals("szociális")) {
visszajelzés = új SocialMediaFeedback();
}
Visszatérés Visszacsatolás;
}
}
Az egyszerű gyári megközelítés azonban nem a gyári tervezési minta, és nem is tervezési minta. Ez inkább egy tervezési koncepció.
A gyári módszer
A gyári módszer a tervezési minta valódi ábrázolása. Gyári módszerrel a reformált FeedbackReportFactoryJava osztály most a következő kódot tartalmazza:
nyilvánosabsztraktosztályFeedbackReportFactory{
nyilvánosabsztraktüresmakeFeedbackReport(Visszajelzés visszajelzés);
}
A gyári tervezési minta szerkezetét a következő osztálydiagrammal határozhatja meg:
A fenti diagramból láthatja, hogy egy absztrakt osztály (vagy interfész) a gyári metódus absztrakt változatát fogja tartalmazni. Tehát az absztrakt osztályt kiterjesztő konkrét gyári osztályok a gyári módszert fogják megvalósítani, olyan tulajdonságokat használva, amelyek egyediek a létrehozni kívánt termékre. Azt is meg kell jegyezni, hogy minden betongyári osztálynak egy vagy több terméket kell létrehoznia.
A minta alkalmazás három kapcsolódó, de egyedi terméket tartalmaz. Minden visszajelzéstípusnak legalább egy egyedi tulajdonsága van. Tehát az alkalmazásnak három betongyárral kell rendelkeznie minden termék elkészítéséhez.
E-mail Visszajelzés Factory
nyilvánososztályE-mail-Visszajelzési jelentéskiterjedFeedbackReportFactory{
Visszajelzés e-mailben;
@Felülbírálás
nyilvánosüresmakeFeedbackReport(Visszajelzés visszajelzés){
ez.feedback = (EmailFeedback) visszajelzés;
Rendszer.ki.println("\nJelentésMertVisszacsatolásKeresztülEmail" +
"\nElbíráló neve: " +ez.feedback.getReviewerName() +
"\nVisszajelzés: " + ez.feedback.getReviewMessage() +
"\nÉrtékelések: " + ez.feedback.getReviewRatings() +
"\nEmail-cím: " + ez.feedback.getReviewerEmail());
}
}
Mail Feedback Factory
nyilvánososztályMailFeedback ReportkiterjedFeedbackReportFactory{
MailFeedback visszajelzés;
@Felülbírálás
nyilvánosüresmakeFeedbackReport(Visszajelzés visszajelzés){
ez.feedback = (MailFeedback) visszajelzés;
Rendszer.ki.println("\nJelentésMertVisszacsatolásKeresztülLevél" +
"\nElbíráló neve: " +ez.feedback.getReviewerName() +
"\nVisszajelzés: " + ez.feedback.getReviewMessage() +
"\nÉrtékelések: " + ez.feedback.getReviewRatings() +
"\nLevelezési cím: " + ez.feedback.getReturnAddress());
}
}
Social Media Feedback Factory
nyilvánososztálySocialMediaFeedbackReportkiterjedFeedbackReportFactory{
SocialMediaFeedback visszajelzés;
@Felülbírálás
nyilvánosüresmakeFeedbackReport(Visszajelzés visszajelzés){
ez.feedback = (SocialMediaFeedback) visszajelzés;
Rendszer.ki.println("\nJelentésMertVisszacsatolásKeresztülSzociálisMédia" +
"\nElbíráló neve: " + ez.feedback.getReviewerName() +
"\nVisszajelzés: " + ez.feedback.getReviewMessage() +
"\nÉrtékelések: " + ez.feedback.getReviewRatings() +
"\nReviewer Social Media Handle: " + ez.feedback.getReviewerHandle());
}
}
A minta alkalmazás tesztelése
Mostantól a megfelelő gyári módszerekkel miniatűr jelentéseket készíthet a különböző csatornákról kapott visszajelzésekről. tudsz tesztelje az alkalmazást a JUnit segítségével, vagy létrehozhat egy járművezetői osztályt:
nyilvánososztályFő{
nyilvánosstatikusüresfő-(String[] args){
Visszajelzés = új e-mail visszajelzés ("Nick", "Szuper termék!", 5, "[email protected]");
Visszajelzési visszajelzés2 = új MailFeedback("János", "A termék jó, de nem olyan, amit rendszeresen vásárolnék.", 4, "első utca");
Visszajelzés3 = új SocialMediaFeedback("Jane", "Nem nekem való", 2, "@janey");
FeedbackReportFactory factory = új EmailFeedbackReport();
FeedbackReportFactory factory2 = új MailFeedbackReport();
FeedbackReportFactory factory3 = új SocialMediaFeedbackReport();
gyár.makeFeedbackReport(Visszacsatolás);
gyár 2.makeFeedbackReport(visszajelzés2);
gyári 3.makeFeedbackReport(visszajelzés3);
}
A fenti fő osztály a megfelelő gyárakat használja három jelentés létrehozásához, amelyek a következő kimenetet állítják elő a konzolon:
A gyári tervezési minta használatának előnyei
A gyári tervezési minta elősegíti a tervezés rugalmasságát, ahol interfészek (vagy absztrakt osztályok) segítségével konkrét osztályokat hozhat létre. A polimorfizmus révén elősegíti a méretezhetőséget is, lehetővé téve az új osztályok számára, hogy megvalósítsák a meglévő felületet, ahogy az alkalmazás bővül.
Ha a gyári tervezési mintát használja, akkor két fontos tervezési elvet alkalmaz: a nyitott-zárást és a vezérlés megfordítását (IoC).