Inizieranno ora una serie di articoli specifici sui Pattern di tipo Creational, in particolare analizzeremo:
- Abstract Factory
- Builder
- Factory Method
- Prototype
- Singleton
Prima di entrare nella analisi approfondita di questi strumenti è utile volgere uno sguardo d’insieme verso l’ambito di applicazione degli stessi.
I Pattern di tipo creational astraggono il processo di instanziazione, in sostanza aiutano a creare un sistema indipendente rispetto a come gli oggetti che lo compongono vengono creati, composti e rappresentati.
Questa categoria di pattern diviene fondamentale durante la fase di evoluzione del sistema nel caso in cui questo dipenda più dalla composizione degli oggetti che dalla ereditarietà delle classi.
Esistono due temi ricorrenti in questi pattern:
- incapsulano tutta la conoscenza all’interno di classi concerete che il sistema utilizza
- nascondono come le istanze delle classi vengono generate
Durante l’analisi dei pattern Creazionali analizzeremo un problema concreto lato applicativo, ovvero la costruzione di un labirinto per un videogioco.
Le caratteristiche principali dell’applicazione saranno:
- Stanze (Room)
- Muri (Wall)
- Porte (Door)
Tutte classi che descrivono le medesime strutture
In più avremo la presenza della classe MapSite, una classe astratta che gestisce tutti i componenti di un labirinto (Room, Wall, Door) e la classe Maze che rappresenta una collezione di stanze.
Esiste una classe ulteriore MazeGame che avrà il compito di creare il labirinto, in particolare genererà:
- Labirnito
- stanze
- porte di comunicazione fra stanze
- etc…
Esaminiamo ora a grandi linee come l’utilizzo dei Design Pattern di tipo creazionale ci può aiutare nella progettazione di questo videogioco.
Innanzitutto è utile sottolineare che i pattern di questa sezione non servono a rendere la struttura più semplice, ma più flessibile, ovvero render più semplice il cambiamento delle classi che definiscono la struttura del un labirinto.
I dettagli:
- Se la classe CreateMaze utilizzasse delle funzioni virtuali per creare stanze, muri e porte invece di utilizzare dei costruttori, allora si potrebbero modificare le stesse classi perchè vengano instanziate creando una sottoclasse (MazeGame) che ne ridefinisca le funzioni. Questo è un esempio di Factory Method
- Se CreateMaze passasse un oggetto come parametro utilizzabile per la creazione di stanze, muri e porte, allora sarebbe possibile cambiare il comportamento delle classi che definiscono porte, muri e stanze semplicemente passandogli parametri differenti. Absreact Factory
- Se CreateMaze passasse un oggetto come parametro utilizzabile per creare un nuovo labirinto nella sua interezza, utilizzando le operazioni per aggiungere muri, porte e stanze, allora si potrebbe utilizzare l’ereditarietà per modificare una parte del labirinto o il modo in cui questo viene costruito. Builder
- Se CreateMaze fosse parametrizzato da vari prototipi di stanze, porte e muri, i quali si accopiano e si aggiungono al labirinto stesso, sarebbe possibile cambiare la composizione del labirinto cambiando questi prototipi con altri. Prototype
- Singleton protebbe assicurare che solo un labirinto per gioco sia accessibile, e così anche per tutti gli altri oggetti che compongono il gioco, senza fare riferiemnto a variabili o funzioni globali.










[...] Creational Patterns [...]