Tehtaan (tai tehdasmenetelmän) suunnittelumalli on erikoistunut delegointiin ja kapselointiin. Tämä malli sallii superluokan lykätä ilmentymistä alaluokkiin. Tämä johtuu siitä, että luokka, joka sisältää ensisijaisen tehdasmetodimallin, on abstrakti.
Tehdasmenetelmän alkuperäinen versio on toteuttamattoman menetelmän muoto, koska se ei tunne tuotetta, jonka se luo. Tehdasmenetelmä saattaa tietää, että se luo jotain tuotetta, mutta se ei tiedä luomansa tuotteen erityispiirteitä. Tämä tieto on vain vastaavien alaluokkien käytettävissä. Siksi vastuu tehdasmenetelmän toteuttamisesta ja asianmukaisten objektien luomisesta on yksinomaan alaluokalla.
Tehdassuunnittelumallin käyttöönotto Javassa
Tässä artikkelissa käytetään esimerkkipalauteraporttien luontisovellusta. Tämä sovellus käyttää erilaisia palautteita, joita yritys saa (uudesta välipalasta) erityisten raporttien luomiseen (tehdasmenetelmällä). Siksi tehdasmalli luo erityisen palautteen (tai palauteraportin) käyttämällä pohjana seuraavaa ensisijaista tuoteluokkaa:
julkinenabstraktiluokkaaPalaute{
yksityinen merkkijono arvioijanNimi;
yksityinen merkkijono ReviewViesti;
yksityinenint arvosteluArviot;
julkinenPalaute(String reviewerName, String reviewMessage, int arvosteluArviot){
Tämä.reviewerName = arvioijanNimi;
Tämä.reviewMessage = reviewMessage;
Tämä.reviewRatings = reviewRatings;
}
julkinen merkkijono getReviewerName(){
palata arvioijanNimi;
}
julkinenmitätönsetReviewerName(merkkijonon arvioijan nimi){
Tämä.reviewerName = arvioijanNimi;
}
julkinen merkkijono getReviewMessage(){
palata ReviewViesti;
}
julkinenmitätönsetReviewMessage(String reviewMessage){
Tämä.reviewMessage = reviewMessage;
}
julkinenintgetReviewRatings(){
palata arvosteluArviot;
}
julkinenmitätönsetReviewRatings(int arvosteluArviot){
Tämä.reviewRatings = reviewRatings;
}
}
Jokaisessa palautteessa on kolme pakollista ominaisuutta, arvioijan nimi, arvosteluviesti ja numeroarvostelu (yhdestä viiteen) uudelle välipalalle. Yrityksen saama erilainen palaute tulee yhdestä kolmesta kanavasta:
Sähköpostipalauteluokka
julkinenluokkaaSähköpostipalauteulottuuPalaute{
yksityinen merkkijono arvioijaSähköposti;
julkinen sähköpostipalaute (merkkijono arvioijan nimi, merkkijono arvostelu Viesti, int reviewArviot, merkkijono arvostelijaSähköposti) {
super(arvostelijaNimi, arvosteluviesti, arvosteluRatings);
Tämä.reviewerEmail = arvioijan sähköposti;
}
julkinen merkkijono getReviewerEmail(){
palata arvioijaSähköposti;
}
julkinenmitätönsetReviewerEmail(merkkijonon tarkistajan sähköposti){
Tämä.reviewerEmail = arvioijan sähköposti;
}
}
Postipalauteluokka
julkinenluokkaaMailFeedbackulottuuPalaute{
yksityinen merkkijono palautusosoite;
julkinen sähköpostipalaute(merkkijono arvioijan nimi, merkkijono arvostelu Viesti, int reviewArviot, merkkijono palautusosoite) {
super(arvostelijaNimi, arvosteluviesti, arvosteluRatings);
Tämä.returnAddress = paluuosoite;
}julkinen merkkijono getReturnAddress(){
palata palautusosoite;
}
julkinenmitätönsetReturnAddress(merkkijono paluuosoite){
Tämä.returnAddress = paluuosoite;
}
}
Sosiaalisen median palautekurssi
julkinenluokkaaSocialMediaFeedbackulottuuPalaute{
yksityinen merkkijono arvioijaHandle;
julkinen SocialMediaFeedback(merkkijono arvioijan nimi, merkkijono arvostelu Viesti, int reviewArviot, merkkijono arvostelijaHandle) {
super(arvostelijaNimi, arvosteluviesti, arvosteluRatings);
Tämä.reviewerHandle = reviewerHandle;
}
julkinen merkkijono getReviewerHandle(){
palata arvioijaHandle;
}
julkinenmitätönsetReviewerHandle(String reviewerHandle){
Tämä.reviewerHandle = reviewerHandle;
}
}
Huomaat, että jokaisella palautealaluokalla on ainutlaatuinen ominaisuus. Tämä tarkoittaa, että sinun on luotava raportti kullekin palautetyypille käyttämällä vähintään yhtä ominaisuutta, joka on ainutlaatuinen kyseiselle tyypille.
Yksinkertainen tehdas
Yksinkertainen tehdas on suosittu tapa käyttää tehdassuunnittelumallia. Tämä lähestymistapa edellyttää kaikkien eri palautteiden (tai tuotteiden) ryhmittelyä menetelmään (yksinkertainen tehdas) ja sopivan palautteen valitseminen parametrin perusteella.
julkinenluokkaaFeedbackReportFactory{
julkinen Palaute anna palautetta(merkkijono palautetyyppi){
Palaute palaute = tyhjä;
jos(feedbackType.equals("sähköposti")) {
palautetta = Uusi Sähköpostipalaute();
}muujos (feedbackType.equals("posti")) {
palautetta = Uusi MailFeedback();
}muujos (feedbackType.equals("sosiaalinen")) {
palautetta = Uusi SocialMediaFeedback();
}
palata palaute;
}
}
Yksinkertainen tehdaslähestymistapa ei kuitenkaan ole tehdassuunnittelumalli eikä se ole suunnittelukuvio. Se on enemmän kuin suunnittelukonsepti.
Tehdasmenetelmä
Tehdasmenetelmä on todellinen esitys suunnittelukuviosta. Tehdasmenetelmää käyttäen uudistettu FeedbackReportFactoryJava luokka sisältää nyt seuraavan koodin:
julkinenabstraktiluokkaaFeedbackReportFactory{
julkinenabstraktimitätönteeFeedbackReport(Palaute palaute);
}
Voit määrittää tehdassuunnittelumallin rakenteen seuraavalla luokkakaaviolla:
Yllä olevasta kaaviosta näet, että abstrakti luokka (tai käyttöliittymä) sisältää abstraktin version tehdasmetodista. Abstraktia luokkaa laajentavat betonitehdasluokat siis toteuttavat tehdasmenetelmän käyttämällä ominaisuuksia, jotka ovat ainutlaatuisia tuotteelle, jonka se haluaa luoda. Huomaa myös, että minkä tahansa betonitehdasluokan tulee luoda yksi tai useampia tuotteita.
Esimerkkisovelluksessa on kolme toisiinsa liittyvää mutta ainutlaatuista tuotetta. Jokaisella palautetyypillä on vähintään yksi ainutlaatuinen ominaisuus. Joten sovelluksessa on oltava kolme betonitehdasta kunkin tuotteen rakentamiseksi.
Sähköpostipalautetehdas
julkinenluokkaaSähköpostipalauteraporttiulottuuFeedbackReportFactory{
Sähköpostipalautepalaute;
@Ohittaa
julkinenmitätönteeFeedbackReport(Palaute palaute){
Tämä.feedback = (EmailFeedback) palaute;
Järjestelmä.ulos.println("\nRaporttivartenPalauteKauttaSähköposti" +
"\nArvostelijan nimi: " +Tämä.feedback.getReviewerName() +
"\nPalaute: " + Tämä.feedback.getReviewMessage() +
"\nArviot: " + Tämä.feedback.getReviewRatings() +
"\nSähköpostiosoite: " + Tämä.feedback.getReviewerEmail());
}
}
Mail Feedback Factory
julkinenluokkaaMailFeedbackReportulottuuFeedbackReportFactory{
MailFeedback palaute;
@Ohittaa
julkinenmitätönteeFeedbackReport(Palaute palaute){
Tämä.feedback = (MailFeedback) palaute;
Järjestelmä.ulos.println("\nRaporttivartenPalauteKauttaMail" +
"\nArvostelijan nimi: " +Tämä.feedback.getReviewerName() +
"\nPalaute: " + Tämä.feedback.getReviewMessage() +
"\nArviot: " + Tämä.feedback.getReviewRatings() +
"\nPostiosoite: " + Tämä.feedback.getReturnAddress());
}
}
Social Media Feedback Factory
julkinenluokkaaSocialMediaFeedbackReportulottuuFeedbackReportFactory{
SocialMediaFeedback palaute;
@Ohittaa
julkinenmitätönteeFeedbackReport(Palaute palaute){
Tämä.feedback = (SocialMediaFeedback) palaute;
Järjestelmä.ulos.println("\nRaporttivartenPalauteKauttaSosiaalinenMedia" +
"\nArvostelijan nimi: " + Tämä.feedback.getReviewerName() +
"\nPalaute: " + Tämä.feedback.getReviewMessage() +
"\nArviot: " + Tämä.feedback.getReviewRatings() +
"\nArvioijan sosiaalisen median kahva: " + Tämä.feedback.getReviewerHandle());
}
}
Näytesovelluksen testaus
Nyt voit tehdä vastaavilla tehdasmenetelmillä pienoisraportteja eri kanavilta saaduista palautteista. Sinä pystyt testaa sovellusta JUnitin avullatai voit luoda kuljettajaluokan:
julkinenluokkaaMain{
julkinenstaattinenmitätönpää(merkkijono[] args){
Palaute palaute = Uusi Sähköpostipalaute ("Nick", "Mahtava tuote!", 5, "[email protected]");
Palautepalaute2 = Uusi MailFeedback("John", "Tuote on hyvä, mutta ei sellainen, jota ostaisin säännöllisesti", 4, "ensimmäinen katu");
Palautepalaute3 = Uusi SocialMediaFeedback("Jane", "Se ei ole minua varten", 2, "@janey");
FeedbackReportFactory tehdas = Uusi SähköpostiFeedbackReport();
FeedbackReportFactory factory2 = Uusi MailFeedbackReport();
FeedbackReportFactory factory3 = Uusi SocialMediaFeedbackReport();
tehdas.makeFeedbackReport(palautetta);
tehdas 2.makeFeedbackReport(palaute 2);
tehdas 3.makeFeedbackReport(palaute3);
}
Yllä oleva pääluokka käyttää vastaavia tehtaita kolmen raportin luomiseen, jotka tuottavat konsolissa seuraavan tulosteen:
Tehdassuunnittelumallin käytön edut
Tehdassuunnittelumalli edistää suunnittelun joustavuutta, jossa käytät rajapintoja (tai abstrakteja luokkia) konkreettisten luokkien luomiseen. Se myös edistää skaalautuvuutta polymorfismin kautta sallimalla uusien luokkien toteuttaa olemassa olevan rajapinnan sovelluksen laajeneessa.
Kun käytät tehdassuunnittelumallia, käytät kahta tärkeää suunnitteluperiaatetta: Open-closed ja Inversion of Control (IoC).