Prototype
Catégorie
Pattern créationnel
Problème
Créer de nouveaux objets en copiant une instance existante (clonage), plutôt que de les créer à partir de zéro. Utile lorsque la création d’objets est coûteuse, ou lorsque vous avez besoin d’éviter l’héritage simplement pour la création d’objets.
Solution
- Déclarer une méthode
clone()oucopy()sur l’interface Prototype - Les classes de prototype concret implémentent la méthode clone, retournant une copie d’elles-mêmes
- Le code client demande un clone au prototype, reçoit un nouvel objet avec le même état
Structure
- Prototype : Interface déclarant la méthode
clone() - ConcretePrototype : Implémente la méthode clone ; crée une copie de lui-même
- Client : Demande un clone à un objet prototype
Avantages clés
- Évite l’héritage — Pas besoin de créer une nouvelle classe pour chaque variation d’objet
- Configuration dynamique à l’exécution — Les objets peuvent être clonés à l’exécution en fonction de l’état actuel
- Création d’objets simplifiée — Pas besoin de connaître les détails de construction de l’objet cloné
- Performance — Le clonage peut être plus rapide que la construction à partir de zéro pour des objets complexes
Compromis
- Copie profonde vs. shallow — Doit décider si copier les objets imbriqués en profondeur ou juste les référencer
- Objets complexes — Cloner des objets avec des structures internes complexes peut être sujet aux erreurs
- Références circulaires — Les objets avec des références circulaires nécessitent un traitement spécial
Quand l’utiliser
- Lorsque le coût de création d’un nouvel objet est élevé par rapport au clonage
- Vous avez besoin d’éviter la hiérarchie de construction de la hiérarchie de classes
- Vous voulez réduire le nombre de sous-classes nécessaires
- Les instances d’une classe peuvent avoir une des quelques combinaisons d’état seulement