Vad är fabriksdesignmönstret?

Vad är fabriksdesignmönstret?
Läsare som du hjälper till att stödja MUO. När du gör ett köp med hjälp av länkar på vår webbplats kan vi tjäna en affiliate-provision. Läs mer.

Fabrikens (eller fabriksmetoden) designmönster är specialiserat på delegering och inkapsling. Detta mönster tillåter en superklass att skjuta upp instansieringen till underklasser. Detta beror på att klassen som innehåller det primära fabriksmetodmönstret är abstrakt.





Windows 10 inga uefi firmware -inställningar

Den ursprungliga versionen av fabriksmetoden antar formen av en oimplementerad metod eftersom den inte känner till produkten som den kommer att skapa. Fabriksmetoden kanske vet att den skapar en produkt, men den känner inte till de specifika egenskaperna hos produkten den kommer att skapa. Denna kunskap är endast tillgänglig för respektive underklass. Därför är ansvaret för att implementera fabriksmetoden och skapa lämpliga objekt endast en underklass.





Implementering av Factory Design Pattern i Java

Den här artikeln använder ett exempel på en applikation för generering av feedbackrapporter. Denna applikation använder de olika typerna av feedback som ett företag får (för ett nytt mellanmål) för att skapa specifika rapporter (med fabriksmetoden). Därför kommer fabriksmönstret att skapa specifik feedback (eller feedbackrapport), med följande primära produktklass som bas:





 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;
  }
}

Varje feedback kommer att ha tre obligatoriska egenskaper, ett recensentnamn, ett recensionsmeddelande och en nummerklassificering (från ett till fem) för det nya mellanmålet. De olika typerna av feedback företaget kommer att få kommer från en av tre kanaler:

E-post feedback 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;
  }
}

Mail Feedback 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;
     }
}

Feedbackklass i sociala medier





 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;
     }
}

Du kommer att märka att varje feedbackunderklass har en unik egenskap. Detta innebär att du måste skapa rapporten för varje feedbacktyp med minst en egenskap som är unik för den typen.

Den enkla fabriken

En enkel fabrik är ett populärt sätt att använda fabriksdesignmönstret. Detta tillvägagångssätt innebär att gruppera alla olika återkopplingar (eller produkter) i en metod (den enkla fabriken) och välja lämplig återkoppling baserat på en parameter.





 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;
     }
}

Den enkla fabriksmetoden är dock inte fabriksdesignmönstret, och det är inte heller ett designmönster. Det är mer som ett designkoncept.

Fabriksmetoden

Fabriksmetoden är den sanna representationen av designmönstret. Med hjälp av fabriksmetoden, den reformerade FeedbackReportFactory Java klass kommer nu att innehålla följande kod:

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

Du kan definiera strukturen för fabriksdesignmönstret med följande klassdiagram:

  Klassdiagram för fabriksmetod

Från diagrammet ovan ser du att en abstrakt klass (eller gränssnitt) kommer att innehålla en abstrakt version av fabriksmetoden. Så de konkreta fabriksklasserna som utökar den abstrakta klassen kommer att implementera fabriksmetoden, med hjälp av egenskaper som är unika för produkten den vill skapa. Du bör också notera att varje betongfabriksklass bör skapa en eller flera produkter.

Exempelapplikationen har tre relaterade men unika produkter. Varje feedbacktyp har minst en unik egenskap. Så applikationen kommer att behöva ha tre betongfabriker för att bygga varje produkt.

E-post Feedback Factory

 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());
     }
}

Mail Feedback Factory

 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());
     }
}

Social Media Feedback Factory

 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());
           }
}

Testa provapplikationen

Nu kan du använda respektive fabriksmetoder för att göra miniatyrrapporter om feedbacken från de olika kanalerna. Du kan testa applikationen med JUnit , eller så kan du skapa en förarklass:

 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);
   }

Huvudklassen ovan använder respektive fabrik för att skapa tre rapporter, som producerar följande utdata i konsolen:

  Fabriksmetoden konsolutgång

Fördelar med att använda Factory Design Pattern

Fabriksdesignmönstret främjar designflexibilitet, där du använder gränssnitt (eller abstrakta klasser) för att skapa konkreta klasser. Det främjar också skalbarhet genom polymorfism, genom att tillåta nya klasser att implementera det befintliga gränssnittet när applikationen expanderar.

När du använder fabriksdesignmönstret använder du två viktiga designprinciper: Öppen-stängd och Inversion of Control (IoC).