Qu'est-ce que le modèle de conception d'usine ?

Qu'est-ce que le modèle de conception d'usine ?
Des lecteurs comme vous aident à soutenir MUO. Lorsque vous effectuez un achat en utilisant des liens sur notre site, nous pouvons gagner une commission d'affiliation. Lire la suite.

Le modèle de conception d'usine (ou méthode d'usine) est spécialisé dans la délégation et l'encapsulation. Ce modèle permet à une superclasse de différer l'instanciation aux sous-classes. En effet, la classe qui contient le modèle de méthode de fabrique principal est abstraite.





La version originale de la méthode d'usine prend la forme d'une méthode non implémentée car elle ne connaît pas le produit qu'elle va créer. La méthode d'usine peut savoir qu'elle crée un produit, mais elle ne connaît pas les caractéristiques spécifiques du produit qu'elle créera. Cette connaissance n'est disponible que pour les sous-classes respectives. Par conséquent, la responsabilité d'implémenter la méthode de fabrication et de créer les objets appropriés incombe uniquement à une sous-classe.





Implémentation du modèle de conception d'usine en Java

Cet article utilise un exemple d'application de génération de rapport de commentaires. Cette application utilise les différents types de feedback reçus par une entreprise (pour un nouveau snack) pour créer des rapports spécifiques (en utilisant la méthode de l'usine). Par conséquent, le modèle d'usine créera un retour d'information spécifique (ou rapport de retour d'information), en utilisant la classe de produits principale suivante comme 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;
  }
}

Chaque commentaire aura trois propriétés obligatoires, un nom de critique, un message de révision et une note numérique (de un à cinq) pour la nouvelle collation. Les différents types de commentaires que l'entreprise recevra proviendront de l'un des trois canaux suivants :

Cours de rétroaction par courriel



 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 commentaires par courrier

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

Cours de rétroaction sur les médias sociaux





mac os x ne peut pas être installé sur cet ordinateur
 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;
     }
}

Vous remarquerez que chaque sous-classe de rétroaction a une propriété unique. Cela signifie que vous devrez créer le rapport pour chaque type de commentaire en utilisant au moins une propriété unique à ce type.

L'usine simple

Une usine simple est une approche populaire pour utiliser le modèle de conception d'usine. Cette approche consiste à regrouper tous les différents retours (ou produits) dans une méthode (l'usine simple) et à sélectionner le retour approprié en fonction d'un paramètre.





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

Cependant, l'approche d'usine simple n'est pas le modèle de conception d'usine, ni un modèle de conception. Cela ressemble plus à un concept de design.

La méthode d'usine

La méthode d'usine est la véritable représentation du modèle de conception. En utilisant la méthode d'usine, le réformé FeedbackReportFactory Classe Java contiendra désormais le code suivant :

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

Vous pouvez définir la structure du modèle de conception d'usine avec le diagramme de classes suivant :

  Diagramme de classe de méthode d'usine

Dans le diagramme ci-dessus, vous verrez qu'une classe abstraite (ou interface) contiendra une version abstraite de la méthode de fabrique. Ainsi, les classes de fabrique concrètes qui étendent la classe abstraite implémenteront la méthode de fabrique, en utilisant des propriétés uniques au produit qu'elles souhaitent créer. Vous devez également noter que toute classe d'usine concrète doit créer un ou plusieurs produits.

L'exemple d'application comporte trois produits liés mais uniques. Chaque type de rétroaction possède au moins une propriété unique. Ainsi, l'application devra avoir trois usines de béton pour construire chaque produit.

Usine de commentaires par e-mail

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

Usine de commentaires par courrier

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

Usine de commentaires sur les médias sociaux

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

Test de l'exemple d'application

Vous pouvez maintenant utiliser les méthodes d'usine respectives pour créer des rapports miniatures sur les commentaires reçus des différents canaux. Vous pouvez tester l'application avec JUnit , ou vous pouvez créer une classe de pilote :

 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 Main ci-dessus utilise les usines respectives pour créer trois rapports, produisant la sortie suivante dans la console :

  Sortie de la console de la méthode d'usine

Avantages de l'utilisation du modèle de conception d'usine

Le modèle de conception d'usine favorise la flexibilité de conception, où vous utilisez des interfaces (ou des classes abstraites) pour créer des classes concrètes. Il favorise également l'évolutivité grâce au polymorphisme, en permettant à de nouvelles classes d'implémenter l'interface existante à mesure que l'application se développe.

Lorsque vous utilisez le modèle de conception d'usine, vous utilisez deux principes de conception importants : ouvert-fermé et inversion de contrôle (IoC).