Wat is het fabrieksontwerppatroon?

Wat is het fabrieksontwerppatroon?
Lezers zoals jij steunen MUO. Wanneer u een aankoop doet via links op onze site, kunnen we een aangesloten commissie verdienen. Lees verder.

Het ontwerppatroon van de fabriek (of fabrieksmethode) is gespecialiseerd in delegatie en inkapseling. Met dit patroon kan een superklasse de instantiëring naar subklassen uitstellen. Dit komt omdat de klasse die het patroon van de primaire fabrieksmethode bevat, abstract is.





De oorspronkelijke versie van de fabrieksmethode neemt de vorm aan van een niet-geïmplementeerde methode omdat het product dat het zal maken niet bekend is. De fabrieksmethode weet misschien dat het een product aan het maken is, maar kent niet de specifieke kenmerken van het product dat het gaat maken. Deze kennis is alleen beschikbaar voor de respectievelijke subklassen. Daarom is de verantwoordelijkheid voor het implementeren van de fabrieksmethode en het maken van geschikte objecten uitsluitend die van een subklasse.





Implementatie van het Factory Design Pattern in Java

Dit artikel maakt gebruik van een voorbeeldtoepassing voor het genereren van feedbackrapporten. Deze applicatie gebruikt de verschillende soorten feedback die een bedrijf ontvangt (voor een nieuwe snack) om specifieke rapporten te maken (volgens de fabrieksmethode). Daarom zal het fabriekspatroon specifieke feedback (of feedbackrapport) creëren, waarbij de volgende primaire productklasse als basis wordt gebruikt:





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

Elke feedback heeft drie verplichte eigenschappen, een naam van een recensent, een beoordelingsbericht en een cijferwaardering (van één tot vijf) voor de nieuwe snack. De verschillende soorten feedback die het bedrijf zal ontvangen, zijn afkomstig van een van de volgende drie kanalen:

Feedbackklasse per e-mail



 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-klasse

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

Feedbackklasse sociale media





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

U zult merken dat elke feedbacksubklasse een unieke eigenschap heeft. Dit betekent dat u het rapport voor elk feedbacktype moet maken met ten minste één eigenschap die uniek is voor dat type.

De eenvoudige fabriek

Een eenvoudige fabriek is een populaire benadering van het gebruik van het fabrieksontwerppatroon. Deze aanpak omvat het groeperen van alle verschillende terugkoppelingen (of producten) in een methode (de eenvoudige fabriek) en het selecteren van de juiste terugkoppeling op basis van een 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;
     }
}

De eenvoudige fabrieksbenadering is echter niet het fabrieksontwerppatroon en ook geen ontwerppatroon. Het is meer een ontwerpconcept.

apache je hebt geen toestemming om toegang te krijgen

De fabrieksmethode

De fabrieksmethode is de waarheidsgetrouwe weergave van het ontwerppatroon. Met behulp van de fabrieksmethode, de hervormde FeedbackReportFactory Java-klasse zal nu de volgende code bevatten:

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

U kunt de structuur van het fabrieksontwerppatroon definiëren met het volgende klassendiagram:

  Fabrieksmethode klassendiagram

In het bovenstaande diagram ziet u dat een abstracte klasse (of interface) een abstracte versie van de fabrieksmethode zal bevatten. De concrete fabrieksklassen die de abstracte klasse uitbreiden, zullen dus de fabrieksmethode implementeren, gebruikmakend van eigenschappen die uniek zijn voor het product dat het wil maken. Houd er ook rekening mee dat elke concrete fabrieksklasse een of meer producten moet maken.

De voorbeeldtoepassing heeft drie gerelateerde maar unieke producten. Elk feedbacktype heeft ten minste één unieke eigenschap. De applicatie heeft dus drie betonfabrieken nodig om elk product te bouwen.

E-mail feedbackfabriek

 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 Fabriek

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

Feedbackfabriek op sociale media

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

De voorbeeldtoepassing testen

Nu kunt u de respectieve fabrieksmethoden gebruiken om miniatuurrapporten te maken over de feedback die u van de verschillende kanalen ontvangt. Jij kan test de applicatie met behulp van JUnit , of u kunt een stuurprogrammaklasse maken:

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

De klasse Main hierboven gebruikt de respectievelijke fabrieken om drie rapporten te maken, met de volgende uitvoer in de console:

  Fabrieksmethode console-uitvoer

Voordelen van het gebruik van het fabrieksontwerppatroon

Het fabrieksontwerppatroon bevordert ontwerpflexibiliteit, waarbij u interfaces (of abstracte klassen) gebruikt om concrete klassen te maken. Het bevordert ook de schaalbaarheid door polymorfisme, door nieuwe klassen toe te staan ​​de bestaande interface te implementeren naarmate de toepassing uitbreidt.

Wanneer u het fabrieksontwerppatroon gebruikt, gebruikt u twee belangrijke ontwerpprincipes: Open-gesloten en Inversion of Control (IoC).