Builder è un design pattern creazionale. Va usato per incapsulare la costruzione di un prodotto e permettere che sia costruito uno step alla volta.
Problema
Dobbiamo costruire un programma per pianificare le vacanze in un parco divertimenti. Gli ospiti del parco possono scegliere un hotel e vari tipi di biglietti, riservare un tavolo al ristorante e perfino prenotare eventi speciali. Una pianificazione deve essere costituita da una struttura simile alla seguente:
Ogni vacanza è pianificata su un certo numero di giorni. Ogni giorno può avere una combinazione qualsiasi di prenotazioni di hotel, biglietti, pranzi ed eventi speciali.
Ogni pianificazione può variare nel numero di giorni e nel tipo di attività incluse. Ad esempio, un visitatore che risiede nelle vicinanze non ha bisogno di un hotel, ma potrebbe voler cenare e prenotarsi per eventi speciali. Un altro utente potrebbe arrivare in aereo ed aver bisogno di un hotel, una prenotazione per la cena e i biglietti d’ingresso.
Quindi, abbiamo bisogno di una struttura dati flessibile che rappresenta la pianificazione dei clienti e tutte le loro variazioni; abbiamo anche bisogno di seguire una sequenza di step potenzialmente complessi per creare la pianificazione. Come possiamo fornire un modo per costruire la struttura complessa senza mescolarla con gli step necessari per crearla.
Soluzione
Il pattern Iterator incapsula l’iterazione in un oggetto separato e nasconde al client la rappresentazione interna della collezione. L’idea di Builder è simile: incapsuliamo la creazione della pianificazione in un oggetto AbstractBuilder
e facciamo sì che il nostro Client
gli chieda di costruirne la struttura.
Client
chiede all’interfaccia astratta AbstractBuilder
di costruire la pianificazione in un certo numero di step, infine chiama il metodo getVacationPlanner
per ottenere l’oggetto completo. Il costruttore concreto VacationBuilder
crea i prodotti reali e li conserva nella struttura complessa vacation
.
Conseguenze
Vantaggi:
• incapsula il modo in cui un oggetto complesso è costruito;
• permette la costruzione degli oggetti in un processo multi-step e variabile (a differenza del pattern Factory che prevede un solo step);
• nasconde al client la rappresentazione interna del prodotto;
• le implementazioni dei prodotti possono essere cambiate tranquillamente, dato che il client vede solo un’interfaccia astratta.
Utilizzi:
• è utilizzato per la costruzione di strutture complesse.
Svantaggi:
• per costruire gli oggetti, il client richiede una maggiore conoscenza del dominio rispetto all’utilizzo del pattern Factory.
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. 97-106