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. En savoir plus.

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

instagram viewer

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 :

publicabstraitclasseRetour{

privé Chaîne nom de l'examinateur ;
privé Chaîne reviewMessage ;
privéentier avisÉvaluations;

publicRetour(chaîne reviewerName, chaîne reviewMessage, entier revueNotes){
ce.reviewerName = reviewerName ;
ce.reviewMessage = reviewMessage;
ce.reviewRatings = reviewRatings ;
}

public Chaîne getReviewerName(){
retour nom de l'examinateur ;
}
publicannulersetReviewerName(Nom de l'examinateur de chaîne){
ce.reviewerName = reviewerName ;
}
public Chaîne getReviewMessage(){
retour reviewMessage ;
}
publicannulersetReviewMessage(Chaîne reviewMessage){
ce.reviewMessage = reviewMessage;
}
publicentiergetReviewRatings(){
retour avisÉvaluations ;
}
publicannulersetReviewRatings(entier revueNotes){
ce.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

publicclasseCommentaires par e-mails'étendRetour{

privé Chaîne reviewerEmail ;

public EmailFeedback(Chaîne nom de l'examinateur, Chaîne reviewMessage, int reviewRatings, Chaîne reviewerEmail) {
super(reviewerName, reviewMessage, reviewRatings);
ce.reviewerEmail = reviewerEmail ;
}
public Chaîne getReviewerEmail(){
retour reviewerEmail ;
}
publicannulersetReviewerEmail(Examinateur de chaînesE-mail){
ce.reviewerEmail = reviewerEmail ;
}
}

Classe de commentaires par courrier

publicclasseMailFeedbacks'étendRetour{

privé Chaîne adresse de retour;

public MailFeedback(Chaîne nom de l'examinateur, Chaîne reviewMessage, int reviewRatings, Chaîne adresse de retour) {
super(reviewerName, reviewMessage, reviewRatings);
ce.returnAddress = returnAddress ;
}

public Chaîne getReturnAddress(){
retour adresse de retour;
}

publicannulersetReturnAddress(Chaîne returnAddress){
ce.returnAddress = returnAddress ;
}
}

Cours de rétroaction sur les médias sociaux

publicclasseCommentaires sur les médias sociauxs'étendRetour{

privé Chaîne reviewerHandle ;

public SocialMediaFeedback(Chaîne nom de l'examinateur, Chaîne reviewMessage, int reviewRatings, Chaîne reviewerHandle) {
super(reviewerName, reviewMessage, reviewRatings);
ce.reviewerHandle = reviewerHandle ;
}

public Chaîne getReviewerHandlegetReviewerHandle(){
retour reviewerHandle ;
}

publicannulersetReviewerHandlesetReviewerHandle(Réviseur de chaînesHandle){
ce.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.

publicclasseFeedbackReportFactory{

public Retour faireCommentaires(Type de retour de chaîne){
Retour d'information = nul;

si(feedbackType.equals("e-mail")) {
commentaires = nouveau EmailFeedback();
}autresi (feedbackType.equals("poster")) {
commentaires = nouveau MailFeedback();
}autresi (feedbackType.equals("social")) {
commentaires = nouveau SocialMediaFeedback();
}
retour retour;
}
}

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é FeedbackReportFactoryClasse Java contiendra désormais le code suivant :

publicabstraitclasseFeedbackReportFactory{
publicabstraitannulerfaireFeedbackReport(Commentaires);
}

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

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

publicclasseRapport d'évaluation par e-mails'étendFeedbackReportFactory{

Commentaires EmailFeedback ;

@Passer outre
publicannulerfaireFeedbackReport(Commentaires){

ce.feedback = (EmailFeedback) commentaires ;

Système.dehors.println("\nRapportPourRetourViaE-mail" +
"\nNom de l'examinateur: " +ce.feedback.getReviewerName() +
"\nCommentaire: " + ce.feedback.getReviewMessage() +
"\nNotes: " + ce.feedback.getReviewRatings() +
"\nAdresse e-mail: " + ce.feedback.getReviewerEmail());
}
}

Usine de commentaires par courrier

publicclasseMailFeedbackReports'étendFeedbackReportFactory{
Commentaires MailFeedback ;

@Passer outre
publicannulerfaireFeedbackReport(Commentaires){
ce.feedback = (MailFeedback) commentaires ;

Système.dehors.println("\nRapportPourRetourViaPoster" +
"\nNom de l'examinateur: " +ce.feedback.getReviewerName() +
"\nCommentaire: " + ce.feedback.getReviewMessage() +
"\nNotes: " + ce.feedback.getReviewRatings() +
"\nAdresse postale: " + ce.feedback.getReturnAddress());
}
}

Usine de commentaires sur les médias sociaux

publicclasseSocialMediaFeedbackReports'étendFeedbackReportFactory{
Commentaires de SocialMediaFeedback ;

@Passer outre
publicannulerfaireFeedbackReport(Commentaires){
ce.feedback = (SocialMediaFeedback) commentaires ;

Système.dehors.println("\nRapportPourRetourViaSocialMédias" +
"\nNom de l'examinateur: " + ce.feedback.getReviewerName() +
"\nCommentaire: " + ce.feedback.getReviewMessage() +
"\nNotes: " + ce.feedback.getReviewRatings() +
"\nIdentifiant de réseau social de l'évaluateur: " + ce.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. Tu peux tester l'application avec JUnit, ou vous pouvez créer une classe de pilote :

publicclassePrincipal{

publicstatiqueannulerprincipal(Chaîne [] arguments){
Retour d'information = nouveau E-mailCommentaires("Pseudo", "Bon produit!", 5, "[email protected]");
Rétroaction rétroaction2 = nouveau MailFeedback("John", "Le produit est bon mais pas quelque chose que j'achèterais régulièrement", 4, "première rue");
Rétroaction rétroaction3 = nouveau SocialMediaFeedback("Jeanne", "Ce n'est pas pour moi", 2, "@janey");

Usine FeedbackReportFactory = nouveau EmailFeedbackReport();
FeedbackReportFactory usine2 = nouveau MailFeedbackReport();
FeedbackReportFactory usine3 = nouveau SocialMediaFeedbackReport();

usine.makeFeedbackReport(retour);
usine2.makeFeedbackReport(commentaires2);
usine3.makeFeedbackReport(commentaires3);
}

La classe Main ci-dessus utilise les usines respectives pour créer trois rapports, produisant la sortie suivante dans la console :

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).