Què és el patró de disseny de fàbrica?

Què és el patró de disseny de fàbrica?
Lectors com tu ajuden a donar suport a MUO. Quan feu una compra mitjançant enllaços al nostre lloc, podem guanyar una comissió d'afiliats. Llegeix més.

El patró de disseny de fàbrica (o mètode de fàbrica) s'especialitza en la delegació i l'encapsulació. Aquest patró permet a una superclasse diferir la instanciació a subclasses. Això es deu al fet que la classe que conté el patró del mètode de fàbrica principal és abstracta.





La versió original del mètode de fàbrica assumeix la forma d'un mètode no implementat perquè no coneix el producte que crearà. El mètode de fàbrica pot saber que està creant algun producte, però no coneix les característiques específiques del producte que crearà. Aquest coneixement només està disponible per a les subclasses respectives. Per tant, la responsabilitat d'implementar el mètode de fàbrica i crear objectes adequats és únicament la d'una subclasse.





Implementació del patró de disseny de fàbrica a Java

Aquest article utilitza una aplicació de generació d'informes de comentaris d'exemple. Aquesta aplicació utilitza els diferents tipus de comentaris que rep una empresa (per a un nou berenar) per crear informes específics (mitjançant el mètode de fàbrica). Per tant, el patró de fàbrica crearà comentaris específics (o informe de comentaris), utilitzant la següent classe de producte principal com a base:





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

Cada comentari tindrà tres propietats obligatòries, un nom de revisor, un missatge de revisió i una puntuació de nombre (d'un a cinc) per al nou berenar. Els diferents tipus de feedback que rebrà l'empresa provindran d'un dels tres canals:

Classe de comentaris per correu electrònic



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

Classe de comentaris per correu

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

Classe de comentaris a les xarxes socials





Outlook 365 bloquejat al perfil de càrrega
 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;
     }
}

Notareu que cada subclasse de comentaris té una propietat única. Això vol dir que haureu de crear l'informe per a cada tipus de comentaris utilitzant almenys una propietat única per a aquest tipus.

La Fàbrica Simple

Una fàbrica simple és un enfocament popular per utilitzar el patró de disseny de fàbrica. Aquest enfocament implica agrupar tots els diferents feedbacks (o productes) en un mètode (la fàbrica simple) i seleccionar el feedback adequat en funció d'un paràmetre.





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

Tanmateix, l'enfocament de fàbrica simple no és el patró de disseny de fàbrica, ni és un patró de disseny. S'assembla més a un concepte de disseny.

El mètode de la fàbrica

El mètode de fàbrica és la veritable representació del patró de disseny. Utilitzant el mètode de fàbrica, el reformat FeedbackReportFactory Classe Java ara contindrà el codi següent:

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

Podeu definir l'estructura del patró de disseny de fàbrica amb el diagrama de classes següent:

  Diagrama de classes del mètode de fàbrica

Al diagrama anterior veureu que una classe abstracta (o interfície) contindrà una versió abstracta del mètode de fàbrica. Per tant, les classes de fàbrica concretes que estenen la classe abstracta implementaran el mètode de fàbrica, utilitzant propietats úniques per al producte que vol crear. També heu de tenir en compte que qualsevol classe de fàbrica de formigó hauria de crear un o més productes.

L'aplicació de mostra té tres productes relacionats però únics. Cada tipus de comentari té almenys una propietat única. Per tant, l'aplicació haurà de tenir tres fàbriques de formigó per construir cada producte.

Fàbrica de comentaris per correu electrònic

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

Fàbrica de comentaris a les xarxes socials

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

Prova de l'aplicació de mostra

Ara podeu utilitzar els mètodes de fàbrica respectius per fer informes en miniatura sobre els comentaris rebuts dels diferents canals. Tu pots prova l'aplicació amb JUnit , o podeu crear una classe de conductor:

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

La classe principal anterior utilitza les respectives fàbriques per crear tres informes, produint la següent sortida a la consola:

  Sortida de consola del mètode de fàbrica

Avantatges d'utilitzar el patró de disseny de fàbrica

El patró de disseny de fàbrica promou la flexibilitat del disseny, on utilitzeu interfícies (o classes abstractes) per crear classes concretes. També promou l'escalabilitat mitjançant el polimorfisme, ja que permet que noves classes implementin la interfície existent a mesura que l'aplicació s'amplia.

Quan utilitzeu el patró de disseny de fàbrica, utilitzeu dos principis de disseny importants: obert-tancat i inversió de control (IoC).