Prototype è un design pattern creazionale. Va utilizzato quando il processo di creazione di un’istanza di una certa classe è costoso o complicato.
Problema
Stiamo sviluppando un gioco di ruolo. Man mano che i nostri eroi si avventurano attraverso un paesaggio creato dinamicamente, incontrano una catena infinita di nemici che devono essere sottomessi. Vorremmo che le caratteristiche dei mostri si evolvessero al variare del paesaggio. Ad esempio, non avrebbe molto senso che i mostri volanti seguano i tuoi personaggi nei regni sottomarini. Infine, vorremmo che i giocatori avanzati possano creare i loro mostri personalizzati.
Soluzione
Prototype ci permette di creare nuove istanze copiando quelle esistenti (in Java, tutto ciò si traduce nell’utilizzare il metodo clone
o nel de-serializzare quando si ha la necessità di copie “deep”). Un aspetto importante di questo pattern è che il codice del client MonsterMaker
può creare nuove istanze senza sapere quale classe specifica venga istanziata.
Dunque il client MonsterMaker
ha bisogno di un oggetto appropriato alla situazione attuale, ma non sa che tipo di mostro riceverà. Il registro MonsterRegistry
cerca il mostro appropriato, ne fa un clone e lo restituisce.
Conseguenze
Vantaggi:
• nasconde al client la complessità del creare nuove istanze;
• fornisce al client l’opzione di generare oggetti il cui tipo non è conosciuto;
• in alcune circostanze, copiare un oggetto può essere più efficiente che crearne uno nuovo.
Utilizzi:
• dovrebbe essere considerato quando un sistema deve creare nuovi oggetti di molti tipi in una complessa gerarchia di classi.
Svantaggi:
• a volte potrebbe essere complicato fare una copia di un oggetto.
Riferimenti
• Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides – Design Patterns. Elementi per il riuso di software a oggetti — © Pearson Education Inc. / © Pearson Paravia Bruno Mondadori, 1995-2008, pp. 117-126