Modèle de prototype
Le prototype donne lieu à un objet cloné qui est différent de l'objet original. L'état de l'original est le même que celui du clone, au moment du clonage. Par la suite, chaque objet peut subir un changement d'état. On peut considérer que cela revient à photocopier l'original, puis à modifier la photocopie à quelques endroits.
Exemple
- Duplication de DVD : Duplication du dvd master pour créer plusieurs copies.
- Objet du rapport : Considérons un objet de rapport qui contient des informations traitées à transmettre à l'interface graphique. Le rapport original contient les données dans l'ordre croissant. Maintenant, en utilisant ce modèle, on peut créer un rapport similaire mais avec des données triées par ordre décroissant.
Avantages
- Performance : Clonage (en utilisant MemberwiseClone ) est considérablement moins coûteux que la création d'un nouvel objet à nouveau (avec la commande nouvel opérateur ). Notez qu'il est nécessaire de remplacer l'option
MemberwiseClose()
pour effectuer une copie profonde.
- Les objets peuvent être clonés de manière très dynamique, sans insister sur l'instanciation préalable. Le premier objet créé peut l'être à n'importe quel moment de l'exécution de l'application, et d'autres duplications peuvent avoir lieu à tout moment ultérieur.
Quand l'utiliser
- Lorsque les classes à instancier sont spécifiées au moment de l'exécution, par exemple, par chargement dynamique.
- Lorsque les instances d'une classe ne peuvent avoir qu'une seule des quelques combinaisons d'état différentes. Il peut être plus pratique d'installer un nombre correspondant de prototypes et de les cloner plutôt que d'instancier la classe manuellement, à chaque fois avec l'état approprié.
Comparaison avec le modèle d'usine
Le pattern Prototype permet de créer des objets personnalisés sans connaître leur classe ni aucun détail sur la façon de les créer. C'est donc sous cet aspect qu'il ressemble beaucoup au pattern Factory Method. Dans ces deux patterns, le client peut créer n'importe quel objet de la classe dérivée sans rien savoir de sa propre structure.
Mais la différence entre les deux modèles est le fait que la Factory Method
se concentre sur la création d'un objet d'un type d'objet non existant en tant qu'une fresh creation
(en comprenant le sous-type exact de la classe Créateur). Le site Prototype
utilise la classe elle-même, notamment la classe dérivée de self duplication
action.
Modèle de méthode d'usine
Dans ce modèle, le client (ou consommateur) demande au créateur (ou usine) un type d'objet spécifique dans une hiérarchie de classes. La méthode Creator de la classe factory délègue la création de l'objet spécifique aux classes dérivées et renvoie l'objet de la classe du type demandé par le client. En substance, vous disposez d'un seul point de contact pour la création de plusieurs objets d'une hiérarchie de classes.
Vous pouvez imaginer que vous vous rendez au guichet d'une compagnie aérienne (contrôleur) et que vous demandez un billet en indiquant votre préférence quant au type de billet (première classe, exécutif ou économique). L'utilisateur ne se préoccupe pas de la manière dont le billet est généré, même si, dans une représentation objet, le billet de première classe et le billet économique sont tous deux dérivés de la classe de billet de base.
Quand utiliser
- La flexibilité est importante (faible couplage)
- Les objets peuvent être étendus dans des sous-classes
- Il y a une raison spécifique pour laquelle une sous-classe serait choisie plutôt qu'une autre - cette logique fait partie de la méthode Factory.
- Un client délègue des responsabilités à des sous-classes dans des hiérarchies parallèles.
Modèle de fabrique abstraite
La fabrique abstraite va un pas plus haut (plus abstrait) que le modèle de méthode de fabrique. Dans ce cas, on peut avoir non pas une seule, mais plusieurs fabriques avec de légères variations. Elle est chargée de créer des objets appartenant à des familles de hiérarchies de classes plutôt qu'à une seule hiérarchie de classes.
Une classe Factory spécifique existe déjà. Mais la Factory aura des méthodes légèrement différentes. Chaque méthode peut produire une instance. Le client peut choisir la méthode appropriée et obtenir l'instance.
Si vous prenez l'exemple de MVC Sur la base d'une conception architecturale parfaite, le client sera une classe de contrôleur d'entreprise tandis que les produits concrets seront tous des entités commerciales. Les usines sont des contrôleurs auxiliaires (" Helper "). Elles travaillent en association avec une demande du contrôleur d'entreprise.
Quand utiliser
- Le système est censé être indépendant de la façon dont ses produits sont créés. Il peut même s'attendre à être indépendant de la façon dont les produits sont composés et représentés. Le terme "produit" s'applique à l'objet résultant final qu'un développeur client devra utiliser en invoquant ses méthodes.
- Le système qui doit être configurable avec l'une des multiples familles de produits. Ainsi, la sélection effective de la famille ne se fera pas au moment du codage mais lors d'une configuration ultérieure.
- La famille de produits est conçue pour fonctionner toujours ensemble.
- La création est destinée à une bibliothèque de produits. Ce qui importe le plus ici, c'est l'interface concernée et non l'implémentation.