La méthode d’usine est un modèle de conception créative, c’est-à-dire lié à la création d’objets. Dans le modèle Factory, nous créons un objet sans exposer la logique de création au client et le client utilise la même interface commune pour créer un nouveau type d’objet.
L’idée est d’utiliser une fonction membre statique (méthode de fabrique statique) qui crée & renvoie des instances, masquant les détails des modules de classe à l’utilisateur.
Un modèle d’usine est l’un des principes de conception de base pour créer un objet, permettant aux clients de créer des objets d’une bibliothèque (expliqué ci-dessous) d’une manière telle qu’elle n’a pas de couplage étroit avec la hiérarchie des classes de la bibliothèque.
Que veut dire quand on parle de bibliothèque et de clients?
Une bibliothèque est quelque chose qui est fourni par un tiers qui expose certaines API publiques et les clients font des appels à ces API publiques pour terminer sa tâche. Un exemple très simple peut être différents types de vues fournis par Android OS.
Pourquoi un motif d’usine?
Comprenons-le avec un exemple:
Sortie:
I am two wheeler
Quels sont les problèmes avec la conception ci-dessus?
Comme vous devez l’avoir observé dans l’exemple ci-dessus, le client crée des objets de l’un ou l’autre de TwoWheeler ou FourWheeler basé sur une entrée lors de la construction de son objet.
Disons, la bibliothèque introduit une nouvelle classe ThreeWheeler pour incorporer également des véhicules à trois roues. Ce qui se passerait? Le client finira par enchaîner un nouveau else si dans l’échelle conditionnelle pour créer des objets de ThreeWheeler. Ce qui à son tour nécessitera que le client soit recompilé. Ainsi, chaque fois qu’une nouvelle modification est apportée du côté de la bibliothèque, le client devra apporter des modifications correspondantes à sa fin et recompiler le code. Semble mauvais? C’est une très mauvaise pratique du design.
Comment éviter le problème?
La réponse est de créer une méthode statique (ou usine). Voyons le code ci-dessous.
Sortie:
I am three wheeler
Dans l’exemple ci-dessus, nous avons totalement découplé la sélection de type pour la création d’objet depuis Client. La bibliothèque est désormais responsable du choix du type d’objet à créer en fonction d’une entrée. Le client a juste besoin d’appeler la méthode Create de la bibliothèque et de transmettre le type qu’il veut sans se soucier de l’implémentation réelle de la création d’objets.
Merci à Rumplestiltskin pour les explications ci-dessus.
Autres exemples de méthode d’usine:
- Dites, dans un système de «dessin», selon l’entrée de l’utilisateur, différentes images comme un carré, un rectangle, un cercle peuvent être dessinées. Ici, nous pouvons utiliser la méthode d’usine pour créer des instances en fonction de l’entrée de l’utilisateur. Pour ajouter un nouveau type de forme, pas besoin de changer le code du client.
- Un autre exemple: sur le site de voyage, nous pouvons réserver des billets de train ainsi que des billets de bus et des billets d’avion. Dans ce cas, l’utilisateur peut donner son type de voyage comme «bus», «train» ou «vol».
Nous avons ici une classe abstraite «AnyTravel» avec une fonction membre statique «GetObject» qui, selon le type de voyage de l’utilisateur, sera créer & l’objet de retour de ‘BusTravel’ ou ‘TrainTravel’. «BusTravel» ou «TrainTravel» ont des fonctions communes comme le nom du passager, l’origine et les paramètres de destination.
Merci à Abhijit Saha qui a fourni les deux premiers exemples.