Mis on tehase kujundusmuster?

Mis on tehase kujundusmuster?
Teiesugused lugejad aitavad MUO-d toetada. Kui teete ostu meie saidil olevate linkide abil, võime teenida sidusettevõtte komisjonitasu. Loe rohkem.

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:





 public abstract class Feedback { 
    
   private String reviewerName;
   private String reviewMessage;
   private int reviewRatings;
    
   public Feedback(String reviewerName, String reviewMessage, int reviewRatings) {
        this.reviewerName = reviewerName;
        this.reviewMessage = reviewMessage;
        this.reviewRatings = reviewRatings;
  }
    
  public String getReviewerName() {
      return reviewerName;
  }
  public void setReviewerName(String reviewerName) {
      this.reviewerName = reviewerName;
  }
  public String getReviewMessage() {
      return reviewMessage;
  }
  public void setReviewMessage(String reviewMessage) {
      this.reviewMessage = reviewMessage;
  }
  public int getReviewRatings() {
      return reviewRatings;
  }
  public void setReviewRatings(int reviewRatings) {
      this.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



 public class EmailFeedback extends Feedback { 
    
  private String reviewerEmail;

  public EmailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerEmail) {
     super(reviewerName, reviewMessage, reviewRatings);
     this.reviewerEmail = reviewerEmail;
  }
  public String getReviewerEmail() {
     return reviewerEmail;
  }
  public void setReviewerEmail(String reviewerEmail) {
     this.reviewerEmail = reviewerEmail;
  }
}

Meili tagasiside klass

 public class MailFeedback extends Feedback { 
    
   private String returnAddress;
    
   public MailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String returnAddress) {
        super(reviewerName, reviewMessage, reviewRatings);
        this.returnAddress = returnAddress;
     }

   public String getReturnAddress() {
       return returnAddress;
     }

   public void setReturnAddress(String returnAddress) {
       this.returnAddress = returnAddress;
     }
}

Sotsiaalmeedia tagasiside klass





kuidas Messengeris emotikone muuta
 public class SocialMediaFeedback extends Feedback { 

   private String reviewerHandle;

   public SocialMediaFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerHandle) {
        super(reviewerName, reviewMessage, reviewRatings);
        this.reviewerHandle = reviewerHandle;
     }
    
   public String getReviewerHandle() {
       return reviewerHandle;
     }

   public void setReviewerHandle(String reviewerHandle) {
       this.reviewerHandle = reviewerHandle;
     }
}

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.

kuidas avada usb Windows 10 -s

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.





 public class FeedbackReportFactory { 
    
    public Feedback makeFeedback(String feedbackType) {
         Feedback feedback = null;
          
         if(feedbackType.equals("email")) {
               feedback = new EmailFeedback();
         }else if (feedbackType.equals("mail")) {
               feedback = new MailFeedback();
         }else if (feedbackType.equals("social")) {
               feedback = new SocialMediaFeedback();
         }
     return feedback;
     }
}

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 FeedbackReportFactory Java klass sisaldab nüüd järgmist koodi:

 public abstract class FeedbackReportFactory { 
    public abstract void makeFeedbackReport(Feedback feedback);
}

Tehase kujundusmustri struktuuri saate määratleda järgmise klassiskeemiga:

  Tehase meetodi klassiskeem

Ü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

 public class EmailFeedbackReport extends FeedbackReportFactory{ 
    
    EmailFeedback feedback;

    @Override
    public void makeFeedbackReport(Feedback feedback) {
          
        this.feedback = (EmailFeedback) feedback;
          
        System.out.println("\nReport For Feedback Via Email" +
                  "\nReviewer Name: " +this.feedback.getReviewerName() +
                  "\nFeedback: " + this.feedback.getReviewMessage() +
                  "\nRatings: " + this.feedback.getReviewRatings() +
                  "\nEmal Address: " + this.feedback.getReviewerEmail());
     }
}

Postitagasiside tehas

 public class MailFeedbackReport extends FeedbackReportFactory { 
    MailFeedback feedback;

    @Override
    public void makeFeedbackReport(Feedback feedback) {
         this.feedback = (MailFeedback) feedback;
          
         System.out.println("\nReport For Feedback Via Mail" +
                     "\nReviewer Name: " +this.feedback.getReviewerName() +
                     "\nFeedback: " + this.feedback.getReviewMessage() +
                     "\nRatings: " + this.feedback.getReviewRatings() +
                     "\nMailing Address: " + this.feedback.getReturnAddress());
     }
}

Sotsiaalmeedia tagasiside tehas

 public class SocialMediaFeedbackReport extends FeedbackReportFactory { 
    SocialMediaFeedback feedback;

    @Override
    public void makeFeedbackReport(Feedback feedback) {
        this.feedback = (SocialMediaFeedback) feedback;
                
        System.out.println("\nReport For Feedback Via Social Media" +
                      "\nReviewer Name: " + this.feedback.getReviewerName() +
                      "\nFeedback: " + this.feedback.getReviewMessage() +
                      "\nRatings: " + this.feedback.getReviewRatings() +
                      "\nReviewer Social Media Handle: " + this.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 abil või saate luua juhiklassi:

 public class Main { 

   public static void main(String[] args) {
       Feedback feedback = new EmailFeedback("Nick", "Great product!", 5, "nick@email.com");
       Feedback feedback2 = new MailFeedback("john", "The product is good but not something I would buy regularly", 4, "first Street");
       Feedback feedback3 = new SocialMediaFeedback("Jane", "It's not for me", 2, "@janey");
          
       FeedbackReportFactory factory = new EmailFeedbackReport();
       FeedbackReportFactory factory2 = new MailFeedbackReport();
       FeedbackReportFactory factory3 = new SocialMediaFeedbackReport();
          
       factory.makeFeedbackReport(feedback);
       factory2.makeFeedbackReport(feedback2);
       factory3.makeFeedbackReport(feedback3);
   }

Ülaltoodud põhiklass kasutab vastavaid tehaseid kolme aruande loomiseks, andes konsoolis järgmise väljundi:

  Tehase meetodi konsooli väljund

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.

Kas saate segada 4 GB ja 8 GB mälu

Kui kasutate tehase kujundusmustrit, kasutate kahte olulist disainipõhimõtet: avatud-sulgemine ja juhtimise ümberpööramine (IoC).