Modèle de création : prototype
Cet article explique comment de nouveaux objets peuvent être créés à partir d'objets existants à l'aide du modèle de prototype.

Qu'est-ce que c'est?
Le pattern Prototype est un pattern de création dans lequel de nouveaux objets sont créés en copiant un objet existant. L'objet dont les copies sont faites s'appelle le prototype . Pour mieux comprendre les objets, vous pouvez considérer l'objet prototype comme la "graine" à partir de laquelle tous les autres objets sont créés. Vous pourriez donc vous demander pourquoi ne créeriez-vous pas de nouveaux objets en cas de besoin au lieu de cloner ceux qui existent déjà. Les motivations des objets prototypes sont les suivantes :
- Parfois, la création d'un nouvel objet est plus coûteuse que la copie d'un objet existant.
- Imaginez si vous ne pouviez pas accéder au constructeur d'une classe de manière statique et que l'environnement d'exécution devait créer une instance de chaque classe chargée dynamiquement. Au lieu de cela, l'application pourrait demander des objets à un gestionnaire de prototypes qui renverrait des clones de prototypes.
- Vous pouvez réduire considérablement le nombre de classes dans un système en faisant varier les valeurs des objets clonés à partir d'une instance prototype.
Diagramme de classe
Le diagramme de classes contient les entités suivantes :
- Prototype
- Prototype Béton
- Client

Prenons l'exemple d'un avion pour mieux comprendre le schéma du prototype. Tout d'abord, nous avons créé une classe pour représenter le F-16. Mais nous savons que le F-16 a quelques variantes. Ainsi pour représenter chacune des variantes du F16, on peut créer des sous-classes. Mais alors nous nous retrouverons avec plusieurs sous-classes dans notre système. De plus, supposons que les variantes F16 ne diffèrent que par leurs types de moteurs. Ensuite, une possibilité serait de conserver une seule classe F16 mais d'ajouter une méthode pour définir le type de moteur de l'avion. De cette façon, nous pouvons créer un seul objet F16 en tant que prototype et le cloner pour différentes versions d'avions.
Tout d'abord, nous créons une interface.

La classe F-16 implémente son interface comme ceci :

Le client peut utiliser le modèle comme ceci :

Notez que la méthode clone de l' interface IAircraftPrototype renvoie un type abstrait . Les clients ne savent pas quelles différentes implémentations de la même interface créeront des sous-classes concrètes. Par exemple, la classe Boeing747 peut être transmise, produisant des copies de tout prototype transmis (un F16 ou un Boeing747). Le modèle de prototype aide à éliminer les sous-classes, car le comportement des objets prototypes peut être modifié en les composant avec des sous-parties.
Copie superficielle ou copie profonde
Le modèle prototype nécessite la classe ou l'interface prototype pour implémenter une méthode clone() . Le clonage peut être superficiel ou profond. Par exemple, si notre classe F-16 a un objet membre de type F16Engine , dans une copie superficielle, l'objet cloné pointera vers le même objet F16Engine que le prototype. Mais dans une copie complète, l'objet cloné obtiendrait sa copie de son objet moteur et de tous les objets imbriqués à l'intérieur. Il n'y aura aucun partage de champs — imbriqués ou non — entre le prototype et son clone.
Chargement dynamique
Le modèle de prototype peut faciliter le chargement dynamique des classes. Le chargement dynamique vous permet de charger une classe au moment de l'exécution au lieu d'avoir la classe disponible au moment de la compilation. Dans un langage prenant en charge le chargement dynamique, un framework créera une instance de la classe chargée et l'enregistrera dans une entité de gestion. Ensuite, lors de l'exécution, votre application peut demander à ce gestionnaire de vous donner un objet qui appartient à cette classe.
Autres exemples
Dans le langage de programmation Java, la classe Object a une méthode clone. La classe implémente l'interface java.lang.Cloneable .
Mises en garde
La mise en œuvre de la méthode de clonage peut être difficile à cause des références circulaires.