Gamyklos (arba gamyklos metodo) dizaino modelis specializuojasi delegavimo ir inkapsuliavimo srityje. Šis modelis leidžia superklasei atidėti poklasių egzistavimą. Taip yra todėl, kad klasė, kurioje yra pirminis gamyklos metodo modelis, yra abstrakti.
Pradinė gamyklinio metodo versija įgauna neįgyvendinto metodo formą, nes nežino produkto, kurį sukurs. Gamyklos metodas gali žinoti, kad jis kuria kokį nors produktą, bet nežino konkrečių gaminio, kurį jis sukurs, savybių. Šios žinios prieinamos tik atitinkamiems poklasiams. Todėl atsakomybė už gamyklos metodo įgyvendinimą ir tinkamų objektų kūrimą tenka tik poklasiui.
„Java“ gamyklinio dizaino modelio įgyvendinimas
Šiame straipsnyje naudojama atsiliepimų ataskaitų generavimo programos pavyzdys. Ši programa naudoja įvairių tipų atsiliepimus, kuriuos įmonė gauna (naujo užkandžio atveju), kad sukurtų konkrečias ataskaitas (naudojant gamyklos metodą). Todėl gamyklos modelis sukurs konkretų atsiliepimą (arba atsiliepimų ataskaitą), kaip pagrindą naudodamas šią pirminę produktų klasę:
viešasabstrakčiaiklasėAtsiliepimas{
privatus Styga recenzentoVardas;
privatus Styga apžvalgaPranešimas;
privatustarpt apžvalgaĮvertinimai;
viešasAtsiliepimas(Eilutės peržiūrėjo vardas, eilutės apžvalgos pranešimas, tarpt apžvalgaĮvertinimai){
tai.reviewerName = recenzentoVardas;
tai.reviewMessage = reviewMessage;
tai.reviewRatings = apžvalgaĮvertinimai;
}
viešas Styga getReviewerName(){
grąžinti recenzentoVardas;
}
viešastuštumasetReviewerName(Eilutės recenzento vardas){
tai.reviewerName = recenzentoVardas;
}
viešas Styga getReviewMessage(){
grąžinti apžvalgaPranešimas;
}
viešastuštumasetReviewMessage(Eilutės apžvalgos pranešimas){
tai.reviewMessage = reviewMessage;
}
viešastarptgetReviewRatings(){
grąžinti apžvalgaĮvertinimai;
}
viešastuštumasetReviewRatings(tarpt apžvalgaĮvertinimai){
tai.reviewRatings = apžvalgaĮvertinimai;
}
}
Kiekvienas atsiliepimas turės tris privalomas ypatybes, recenzento vardą, apžvalgos pranešimą ir skaičiaus įvertinimą (nuo vieno iki penkių) naujam užkandžiui. Įvairių tipų atsiliepimai, kuriuos įmonė gaus, bus pateikti vienu iš trijų kanalų:
Atsiliepimų klasė el. paštu
viešasklasėAtsiliepimai el. paštutęsiasiAtsiliepimas{
privatus Styga recenzentasEl. paštas;
viešas el. pašto atsiliepimas (Styga recenzento vardas, Styga apžvalgaPranešimas, int reviewĮvertinimai, Styga ReviewerEmail) {
super(reviewerName, reviewMessage, reviewRatings);
tai.reviewerEmail = recenzento el. paštas;
}
viešas Styga getReviewerEmail(){
grąžinti recenzentasEl. paštas;
}
viešastuštumasetReviewerEmail(Eilutės apžvalgininko el. paštas){
tai.reviewerEmail = recenzento el. paštas;
}
}
Pašto atsiliepimų klasė
viešasklasėPašto AtsiliepimaitęsiasiAtsiliepimas{
privatus Styga grąžinimo adresas;
viešas pašto atsiliepimas (Styga recenzento vardas, Styga apžvalgaPranešimas, int reviewĮvertinimai, Styga returnAddress) {
super(reviewerName, reviewMessage, reviewRatings);
tai.returnAddress = returnAddress;
}viešas Styga gautiReturnAddress(){
grąžinti grąžinimo adresas;
}
viešastuštumasetReturnAddress(Eilutės grąžinimo adresas){
tai.returnAddress = returnAddress;
}
}
Socialinės žiniasklaidos atsiliepimų klasė
viešasklasėSocialMediaFeedbacktęsiasiAtsiliepimas{
privatus Styga recenzentasHandle;
viešas SocialMediaFeedback(Styga recenzento vardas, Styga apžvalgaPranešimas, int reviewĮvertinimai, Styga reviewerHandle) {
super(reviewerName, reviewMessage, reviewRatings);
tai.reviewerHandle = reviewerHandle;
}
viešas Styga getReviewerHandle(){
grąžinti recenzentasHandle;
}
viešastuštumasetReviewerHandle(Eilutės peržiūros rankena){
tai.reviewerHandle = reviewerHandle;
}
}
Pastebėsite, kad kiekvienas grįžtamojo ryšio poklasis turi unikalią savybę. Tai reiškia, kad turėsite sukurti kiekvieno atsiliepimo tipo ataskaitą naudodami bent vieną ypatybę, kuri yra unikali tam tipui.
Paprastoji gamykla
Paprasta gamykla yra populiarus būdas naudoti gamyklos dizaino modelį. Šis metodas apima visų skirtingų atsiliepimų (arba produktų) grupavimą pagal metodą (paprastą gamyklą) ir atitinkamo grįžtamojo ryšio parinkimą pagal parametrą.
viešasklasėAtsiliepimaiReportFactory{
viešas Atsiliepimas padaryti Atsiliepimus(Eilutės atsiliepimo tipas){
Atsiliepimai = nulinis;
jeigu(feedbackType.equals("el. paštas")) {
atsiliepimai = naujas Atsiliepimai el. paštu();
}Kitasjeigu (feedbackType.equals("Paštas")) {
atsiliepimai = naujas MailFeedback();
}Kitasjeigu (feedbackType.equals("socialinis")) {
atsiliepimai = naujas SocialMediaFeedback();
}
grąžinti Atsiliepimas;
}
}
Tačiau paprastas gamyklos metodas nėra nei gamyklos dizaino modelis, nei dizaino modelis. Tai daugiau kaip dizaino koncepcija.
Gamyklos metodas
Gamyklos metodas yra tikrasis dizaino modelio vaizdas. Taikant gamyklinį metodą, reformuotas AtsiliepimaiReportFactoryJava klasė dabar bus toks kodas:
viešasabstrakčiaiklasėAtsiliepimaiReportFactory{
viešasabstrakčiaituštumamakeFeedbackReport(Atsiliepimai);
}
Gamyklos dizaino modelio struktūrą galite apibrėžti naudodami šią klasių diagramą:
Iš aukščiau pateiktos diagramos pamatysite, kad abstrakčioje klasėje (arba sąsajoje) bus abstrakčioji gamyklinio metodo versija. Taigi, betono gamyklos klasės, išplečiančios abstrakčiąją klasę, įgyvendins gamyklos metodą, naudodamos savybes, kurios yra unikalios gaminiui, kurį norima sukurti. Taip pat turėtumėte atkreipti dėmesį, kad bet kuri betono gamyklos klasė turėtų sukurti vieną ar daugiau gaminių.
Programos pavyzdyje yra trys susiję, bet unikalūs produktai. Kiekvienas grįžtamojo ryšio tipas turi bent vieną unikalią savybę. Taigi kiekvienam produktui sukurti reikės trijų betono gamyklų.
Atsiliepimų gamykla el. paštu
viešasklasėAtsiliepimų ataskaita el. paštutęsiasiAtsiliepimaiReportFactory{
Atsiliepimai el. paštu;
@Nepaisyti
viešastuštumamakeFeedbackReport(Atsiliepimai){
tai.feedback = (Atsiliepimai el. paštu) atsiliepimai;
Sistema.išėjo.println("\nPraneštiDėlAtsiliepimasPerEl. paštas" +
"\nRecenzento vardas: " +tai.feedback.getReviewerName() +
"\nAtsiliepimas: " + tai.feedback.getReviewMessage() +
"\nĮvertinimai: " + tai.feedback.getReviewRatings() +
"\nEmail adresas: " + tai.feedback.getReviewerEmail());
}
}
Pašto atsiliepimų gamykla
viešasklasėPašto atsiliepimų ataskaitatęsiasiAtsiliepimaiReportFactory{
MailFeedback atsiliepimai;
@Nepaisyti
viešastuštumamakeFeedbackReport(Atsiliepimai){
tai.feedback = (MailFeedback) atsiliepimai;
Sistema.išėjo.println("\nPraneštiDėlAtsiliepimasPerPaštas" +
"\nRecenzento vardas: " +tai.feedback.getReviewerName() +
"\nAtsiliepimas: " + tai.feedback.getReviewMessage() +
"\nĮvertinimai: " + tai.feedback.getReviewRatings() +
"\nPašto adresas: " + tai.feedback.getReturnAddress());
}
}
Socialinių tinklų atsiliepimų fabrikas
viešasklasėSocialMediaFeedbackReporttęsiasiAtsiliepimaiReportFactory{
SocialMediaFeedback atsiliepimai;
@Nepaisyti
viešastuštumamakeFeedbackReport(Atsiliepimai){
tai.feedback = (SocialMediaFeedback) atsiliepimai;
Sistema.išėjo.println("\nPraneštiDėlAtsiliepimasPerSocialinisŽiniasklaida" +
"\nRecenzento vardas: " + tai.feedback.getReviewerName() +
"\nAtsiliepimas: " + tai.feedback.getReviewMessage() +
"\nĮvertinimai: " + tai.feedback.getReviewRatings() +
"\nRecenzento socialinės žiniasklaidos rankena: " + tai.feedback.getReviewerHandle());
}
}
Programos pavyzdžio testavimas
Dabar galite naudoti atitinkamus gamyklinius metodus, kad sudarytumėte miniatiūrines ataskaitas apie atsiliepimus, gautus iš skirtingų kanalų. Tu gali išbandykite programą naudodami JUnit, arba galite sukurti vairuotojo klasę:
viešasklasėPagrindinis{
viešasstatinistuštumapagrindinis(String[] args){
Atsiliepimai = naujas Atsiliepimai el. paštu ("Nikas", "Puikus produktas!", 5, "[email protected]");
Atsiliepimai2 = naujas Pašto atsiliepimai ("džonas", „Prekė gera, bet ne tokia, kurią pirkčiau reguliariai“, 4, "pirmoji gatvė");
Atsiliepimai atsiliepimai3 = naujas SocialMediaFeedback("Džeina", "Tai ne man", 2, "@janey");
AtsiliepimaiReportFactory gamykla = naujas El. paštasFeedbackReport();
AtsiliepimaiReportFactory factory2 = naujas MailFeedbackReport();
AtsiliepimaiReportFactory factory3 = naujas SocialMediaFeedbackReport();
gamykla.makeFeedbackReport(Atsiliepimas);
gamykla2.makeFeedbackReport(atsiliepimai2);
gamykla3.makeFeedbackReport(atsiliepimai3);
}
Aukščiau pateikta pagrindinė klasė naudoja atitinkamas gamyklas, kad sukurtų tris ataskaitas, kurios konsolėje pateikia tokią išvestį:
Gamyklos dizaino modelio naudojimo pranašumai
Gamyklos dizaino modelis skatina dizaino lankstumą, kai naudojate sąsajas (arba abstrakčias klases), kad sukurtumėte konkrečias klases. Tai taip pat skatina mastelio keitimą per polimorfizmą, leisdama naujoms klasėms įdiegti esamą sąsają, kai programa plečiasi.
Kai naudojate gamyklinį projektavimo modelį, naudojate du svarbius projektavimo principus: atvirą-uždarymą ir valdymo inversiją (IoC).