Tehase (või tehasemeetodi) disainimuster on spetsialiseerunud delegeerimisele ja kapseldamisele. See muster võimaldab ülemklassil instantseerimist alamklassidesse edasi lükata. Selle põhjuseks on asjaolu, et klass, mis sisaldab esmast tehasemeetodi mustrit, on abstraktne.
Tehase meetodi algne versioon eeldab rakendamata meetodi vormi, kuna see ei tunne toodet, mille ta loob. Tehase meetod võib küll teada, et ta loob mingit toodet, kuid ei tea loodava toote spetsiifilisi omadusi. Need teadmised on kättesaadavad ainult vastavatele alamklassidele. Seetõttu vastutab tehase meetodi rakendamise ja sobivate objektide loomise eest ainult alamklass.
Tehase disaini mustri rakendamine Javas
Selles artiklis kasutatakse tagasisidearuannete genereerimise näidisrakendust. See rakendus kasutab erinevat tüüpi tagasisidet, mida ettevõte saab (uue suupiste kohta), et luua konkreetseid aruandeid (kasutades tehase meetodit). Seetõttu loob tehase muster konkreetse tagasiside (või tagasiside aruande), kasutades alusena järgmist esmast tooteklassi:
avalikabstraktneklassTagasiside{
privaatne String arvustajaNimi;
privaatne String ülevaade Sõnum;
privaatneint arvustused Hinnangud;
avalikTagasiside(String reviewerName, String reviewMessage, int arvustused Hinnangud){
see.reviewerName = arvustajaNimi;
see.reviewMessage = reviewMessage;
see.reviewRatings = reviewRatings;
}
avalik String getReviewerName(){
tagasi arvustajaNimi;
}
avaliktühinesetReviewerName(Stringi ülevaatajaName){
see.reviewerName = arvustajaNimi;
}
avalik String getReviewMessage(){
tagasi ülevaade Sõnum;
}
avaliktühinesetReviewMessage(stringi ülevaatesõnum){
see.reviewMessage = reviewMessage;
}
avalikintgetReviewRatings(){
tagasi arvustused Hinnangud;
}
avaliktühinesetReviewRatings(int arvustused Hinnangud){
see.reviewRatings = reviewRatings;
}
}
Igal tagasisidel on uue suupiste jaoks kolm kohustuslikku atribuuti, arvustaja nimi, arvustuse teade ja arvuline hinnang (ühest viieni). Erinevat tüüpi tagasiside, mida ettevõte saab, pärineb ühest kolmest kanalist:
Meili tagasiside klass
avalikklassMeilitagasisideulatubTagasiside{
privaatne String arvustajaEmail;
avalik meilitagasiside (String arvustajaName, String arvustussõnum, int review Ratings, String arvustajaE-post) {
Super(reviewerName, reviewMessage, reviewRatings);
see.reviewerEmail = arvustajaEmail;
}
avalik String saadaReviewerEmail(){
tagasi arvustajaEmail;
}
avaliktühinesetReviewerEmail(Stringi ülevaataja e-post){
see.reviewerEmail = arvustajaEmail;
}
}
Meili tagasiside klass
avalikklassMailFeedbackulatubTagasiside{
privaatne String saatja aadress;
avalik e-posti tagasiside(String arvustajaName, String arvustussõnum, int review Ratings, String saatja aadress) {
Super(reviewerName, reviewMessage, reviewRatings);
see.returnAddress = returnAddress;
}avalik String saadaReturnAddress(){
tagasi saatja aadress;
}
avaliktühinesetReturnAddress(String returnAddress){
see.returnAddress = returnAddress;
}
}
Sotsiaalmeedia tagasiside klass
avalikklassSotsiaalmeedia tagasisideulatubTagasiside{
privaatne String arvustajaHandle;
avalik sotsiaalmeedia tagasiside(String arvustajaName, String arvustussõnum, int review Ratings, String arvustajaHandle) {
Super(reviewerName, reviewMessage, reviewRatings);
see.reviewerHandle = arvustajaHandle;
}
avalik String getReviewerHandle(){
tagasi arvustajaHandle;
}
avaliktühinesetReviewerHandle(String reviewerHandle){
see.reviewerHandle = arvustajaHandle;
}
}
Märkate, et igal tagasiside alamklassil on ainulaadne omadus. See tähendab, et peate looma aruande iga tagasisidetüübi jaoks, kasutades vähemalt ühte selle tüübi jaoks ainulaadset atribuuti.
Lihtne tehas
Lihtne tehas on populaarne lähenemine tehase disainimustri kasutamisele. See lähenemisviis hõlmab kõigi erinevate tagasisidete (või toodete) rühmitamist meetodisse (lihtne tehas) ja sobiva tagasiside valimist parameetri alusel.
avalikklassFeedbackReportFactory{
avalik Tagasiside tee Tagasiside(stringi tagasiside tüüp){
Tagasiside tagasiside = null;
kui(feedbackType.equals("e-post")) {
tagasiside = uus EmailFeedback();
}muidukui (feedbackType.equals("post")) {
tagasiside = uus MailFeedback();
}muidukui (feedbackType.equals("sotsiaalne")) {
tagasiside = uus SocialMediaFeedback();
}
tagasi tagasiside;
}
}
Lihtne tehaselähenemine ei ole aga tehasekujundusmuster ega ka disainimuster. See on rohkem nagu disainikontseptsioon.
Tehase meetod
Tehase meetod on disainimustri tõeline esitus. Tehasemeetodil reformitud FeedbackReportFactoryJava klass sisaldab nüüd järgmist koodi:
avalikabstraktneklassFeedbackReportFactory{
avalikabstraktnetühinemakeFeedbackReport(Tagasiside tagasiside);
}
Tehase kujundusmustri struktuuri saate määratleda järgmise klassiskeemiga:
Ülaltoodud diagrammil näete, et abstraktne klass (või liides) sisaldab tehasemeetodi abstraktset versiooni. Abstraktset klassi laiendavad betoonitehase klassid rakendavad tehase meetodit, kasutades selle toote jaoks ainulaadseid omadusi, mida see luua soovib. Samuti peaksite arvestama, et iga betoonitehase klass peaks looma ühe või mitu toodet.
Näidisrakenduses on kolm omavahel seotud, kuid ainulaadset toodet. Igal tagasisidetüübil on vähemalt üks kordumatu omadus. Seega peab rakendusel olema iga toote ehitamiseks kolm betooni tehast.
E-posti tagasiside tehas
avalikklassMeilitagasisidearuanneulatubFeedbackReportFactory{
Tagasiside e-post;
@Alista
avaliktühinemakeFeedbackReport(Tagasiside tagasiside){
see.feedback = (EmailFeedback) tagasiside;
Süsteem.välja.println("\nAruanneSestTagasisideViaMeil" +
"\nÜlevaataja nimi: " +see.feedback.getReviewerName() +
"\nTagasiside: " + see.feedback.getReviewMessage() +
"\nHinnangud: " + see.feedback.getReviewRatings() +
"\nE-posti aadress: " + see.feedback.getReviewerEmail());
}
}
Postitagasiside tehas
avalikklassMailFeedback ReportulatubFeedbackReportFactory{
MailFeedback tagasiside;
@Alista
avaliktühinemakeFeedbackReport(Tagasiside tagasiside){
see.feedback = (MailFeedback) tagasiside;
Süsteem.välja.println("\nAruanneSestTagasisideViaMail" +
"\nÜlevaataja nimi: " +see.feedback.getReviewerName() +
"\nTagasiside: " + see.feedback.getReviewMessage() +
"\nHinnangud: " + see.feedback.getReviewRatings() +
"\nPostiaadress: " + see.feedback.getReturnAddress());
}
}
Sotsiaalmeedia tagasiside tehas
avalikklassSotsiaalmeedia tagasiside aruanneulatubFeedbackReportFactory{
SocialMediaFeedback tagasiside;
@Alista
avaliktühinemakeFeedbackReport(Tagasiside tagasiside){
see.feedback = (SocialMediaFeedback) tagasiside;
Süsteem.välja.println("\nAruanneSestTagasisideViaSotsiaalneMeedia" +
"\nÜlevaataja nimi: " + see.feedback.getReviewerName() +
"\nTagasiside: " + see.feedback.getReviewMessage() +
"\nHinnangud: " + see.feedback.getReviewRatings() +
"\nÜlevaataja sotsiaalmeedia käepide: " + see.feedback.getReviewerHandle());
}
}
Näidisrakenduse testimine
Nüüd saate vastavate tehase meetodite abil koostada miniatuurseid aruandeid erinevatelt kanalitelt saadud tagasiside kohta. Sa saad testige rakendust JUniti abilvõi saate luua juhiklassi:
avalikklassPeamine{
avalikstaatilinetühinepeamine(String[] args){
Tagasiside tagasiside = uus Tagasiside meilile ("Nick", "Suurepärane toode!", 5, "[email protected]");
Tagasiside tagasiside2 = uus MailFeedback("John", "Toode on hea, kuid mitte midagi, mida ma regulaarselt ostaksin", 4, "esimene tänav");
Tagasiside tagasiside3 = uus Sotsiaalmeedia tagasiside("Jane", "See pole minu jaoks", 2, "@janey");
FeedbackReportFactory tehas = uus EmailFeedbackReport();
FeedbackReportFactory factory2 = uus MailFeedbackReport();
FeedbackReportFactory factory3 = uus SocialMediaFeedbackReport();
tehas.makeFeedbackReport(tagasisidet);
tehas 2.makeFeedbackReport(tagasiside2);
tehas 3.makeFeedbackReport(tagasiside3);
}
Ülaltoodud põhiklass kasutab vastavaid tehaseid kolme aruande loomiseks, andes konsoolis järgmise väljundi:
Tehasekujundusmustri kasutamise eelised
Tehase disainimuster soodustab disaini paindlikkust, kus kasutate konkreetsete klasside loomiseks liideseid (või abstraktseid klasse). Samuti soodustab see mastaapsust polümorfismi kaudu, võimaldades uutel klassidel olemasolevat liidest rakendada, kui rakendus laieneb.
Kui kasutate tehase kujundusmustrit, kasutate kahte olulist disainipõhimõtet: avatud-sulgemine ja juhtimise ümberpööramine (IoC).