¿Qué es el patrón de diseño de fábrica?

¿Qué es el patrón de diseño de fábrica?

El patrón de diseño de fábrica (o método de fábrica) se especializa en delegación y encapsulación. Este patrón permite que una superclase difiera la creación de instancias a las subclases. Esto se debe a que la clase que contiene el patrón del método de fábrica principal es abstracta.

La versión original del método de fábrica asume la forma de un método no implementado porque no conoce el producto que creará. El método de fábrica puede saber que está creando algún producto, pero no conoce las características específicas del producto que creará. Este conocimiento solo está disponible para las respectivas subclases. Por lo tanto, la responsabilidad de implementar el método de fábrica y crear objetos apropiados es únicamente de una subclase.

Implementando el patrón de diseño de fábrica en Java

Este artículo utiliza una aplicación de generación de informes de comentarios de muestra. Esta aplicación utiliza los diferentes tipos de comentarios que recibe una empresa (para un nuevo refrigerio) para crear informes específicos (usando el método de fábrica). Por lo tanto, el patrón de fábrica creará comentarios específicos (o informes de comentarios), utilizando la siguiente clase de producto principal como 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 comentario tendrá tres propiedades obligatorias, un nombre de revisor, un mensaje de revisión y una calificación numérica (de uno a cinco) para el nuevo refrigerio. Los diferentes tipos de comentarios que recibirá la empresa provendrán de uno de estos tres canales:

Clase de retroalimentación por correo electrónico

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

Clase de comentarios por correo

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

Clase de retroalimentación de redes sociales

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

Notará que cada subclase de retroalimentación tiene una propiedad única. Esto significa que deberá crear el informe para cada tipo de comentario utilizando al menos una propiedad que sea única para ese tipo.

La fábrica sencilla

Una fábrica simple es un enfoque popular para usar el patrón de diseño de fábrica. Este enfoque implica agrupar todas las diferentes retroalimentaciones (o productos) en un método (la fábrica simple) y seleccionar la retroalimentación adecuada en función de un parámetro.

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

Sin embargo, el enfoque de fábrica simple no es el patrón de diseño de fábrica, ni es un patrón de diseño. Es más como un concepto de diseño.

El método de fábrica

El método de fábrica es la verdadera representación del patrón de diseño. Usando el método de fábrica, la clase Java FeedbackReportFactory reformada ahora contendrá el siguiente código:

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

Puede definir la estructura del patrón de diseño de fábrica con el siguiente diagrama de clases:

Diagrama de clase de método de fábrica

En el diagrama anterior, verá que una clase abstracta (o interfaz) contendrá una versión abstracta del método de fábrica. Entonces, las clases de fábrica concretas que extienden la clase abstracta implementarán el método de fábrica, utilizando propiedades que son únicas para el producto que desea crear. También debe tener en cuenta que cualquier clase de fábrica concreta debe crear uno o más productos.

La aplicación de muestra tiene tres productos relacionados pero únicos. Cada tipo de comentario tiene al menos una propiedad única. Por lo tanto, la aplicación deberá tener tres fábricas concretas para construir cada producto.

Fábrica de comentarios por correo electrónico

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

Fábrica de comentarios de correo

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 comentarios de redes sociales

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

Prueba de la aplicación de muestra

Ahora puedes usar los respectivos métodos de fábrica para hacer informes en miniatura sobre los comentarios recibidos de los diferentes canales. Puede probar la aplicación usando JUnit, o puede crear una clase de controlador:

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 clase principal anterior usa las fábricas respectivas para crear tres informes, produciendo el siguiente resultado en la consola:

Salida de la consola del método de fábrica

Ventajas de usar el patrón de diseño de fábrica

El patrón de diseño de fábrica promueve la flexibilidad de diseño, donde usa interfaces (o clases abstractas) para crear clases concretas. También promueve la escalabilidad a través del polimorfismo, al permitir que nuevas clases implementen la interfaz existente a medida que se expande la aplicación.

Cuando utiliza el patrón de diseño de fábrica, utiliza dos principios de diseño importantes: abierto-cerrado e inversión de control (IoC).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *