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() ou copy() 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

Exemples