<aside> 📘

Crée de nouveaux objets à partir d’objets existants sans rendre le code dépendant de leur classe.

</aside>

😠Problème

<aside> 🎯

Copie exacte d’un objet ayant certains attributs invisibles en dehors de l’objet ou sa classe concrète.

</aside>

Copier un objet « depuis l’extérieur » n’est pas toujours possible.

Copier un objet « depuis l’extérieur » n’est pas toujours possible.

😀Solution

<aside> ✅

Délèguer le processus de clonage aux objets qui vont être copiés.

</aside>

Protoype déclare une interface commune pour tous les objets qui pourront être clonés. Cette interface vous permet de cloner un objet sans coupler votre code à la classe de cet objet. En général, une telle interface ne contient qu’une seule méthode clone.

Les prototypes préconstruits sont une alternative au sous-classage.

Les prototypes préconstruits sont une alternative au sous-classage.

Leur fonctionnement est le suivant : vous créez un ensemble d’objets configurés différemment. Dès que vous avez besoin de l’un de ces objets, vous clonez un prototype plutôt que d’en construire un nouveau.

Structure

Implémentation de base

image.png

  1. L’interface Prototype déclare les méthodes de clonage. Dans la majorité des cas, il n’y a qu’une seule méthode clone.
  2. La classe Prototype Concret implémente la méthode de clonage. En plus de copier les données de l’objet original dans le clone, cette méthode peut gérer des cas particuliers du processus de clonage, comme des objets imbriqués, démêler les dépendances récursives, etc.
  3. Le Client peut produire une copie de n’importe quel objet implémentant l’interface prototype.

Implémentation du registre de prototypes

image.png

  1. Le Registre de Prototypes facilite l’accès aux prototypes fréquemment utilisés. Il stocke un ensemble d’objets préconstruits qui ont déjà été copiés. Le registre de prototypes le plus simple est une table de hachage (hash map) nom → prototype. Si vous voulez de meilleurs critères de recherche qu’un simple nom, construisez une version plus robuste du registre.