Modello Creativo: Costruttore
Questo articolo discute come oggetti complessi possono essere rappresentati e costruiti senza accoppiare le due operazioni.
Che cos'è?
Il modello builder riduce la quantità di codice necessaria per creare oggetti. Pertanto, se hai una cosa complessa da costruire, puoi semplificare questo processo usando il modello builder. Un oggetto composito o aggregato è ciò che generalmente fa un costruttore.
Il builder pattern incapsula il processo di costruzione di un oggetto complesso, separando la sua rappresentazione dalla sua costruzione. Questo ci permette di creare diversi modelli con lo stesso processo di costruzione. In linguaggio Java, questo significa creare oggetti di altre classi che possono condividere lo stesso processo di costruzione.
Diagramma di classe
Il diagramma di classe include le seguenti entità:
- Costruttore
- Costruttore di cemento
- Direttore
- Prodotto
Continuando con il nostro esempio di aeroplani, diciamo che la costruzione di un aereo prevede tre passaggi:
- la realizzazione del pozzetto
- poi il motore
- e infine le ali
Diamo ora un'occhiata al codice. Innanzitutto, inizieremo con l'interfaccia astratta per la nostra AircraftBuilderclasse. Successivamente, ogni builder contiene metodi che possono essere sovrascritti dai builder concreti a seconda che includeranno o meno quella parte nella variante del prodotto finale che sono responsabili della costruzione.
Ora implementeremo due costruttori di cemento, uno per l'F-16 e uno per il Boeing-747.
Per semplicità, abbiamo fornito lo scheletro dei builder e saltato l'implementazione individuale di ciascun metodo. Non F16Builderannulla il buildBathroomsmetodo perché non ci sono bagni nella cabina di pilotaggio dell'F-16. Il creatore del Boeing 747 ignora il metodo del bagno poiché un Boeing 747 ha bagni per i passeggeri.
La Directorclasse è responsabile della registrazione del processo o dell'algoritmo richiesto per creare un aereo, come l'ordine specifico in cui vengono realizzate le diverse parti. Il regista è come un costruttore dell'aereo. Il prodotto finito gli viene restituito dai costruttori.
Si noti che possiamo trasmettere il costruttore di nostra scelta e variare il prodotto dell'aeromobile (rappresentazione) in modo che sia un F-16 o un Boeing-747. Nel nostro scenario, i costruttori restituiscono diversi supertipi, ma questo potrebbe non essere il caso se restituiscono prodotti che non sono molto simili.
Il cliente applicherà il pattern in questo modo:
L' AircraftBuilderinterfaccia nasconde come viene costruito un aereo. Il cliente non è a conoscenza delle classi F16Enginee F16Cockpitche vengono utilizzate per creare i Boeing-747.
Salto il direttore
Il modello Builder viene spesso utilizzato senza il regista. Invece, il client può istanziare direttamente il builder e invocare i metodi richiesti per ottenere un prodotto per se stesso. Questo è un antidoto comune per i costruttori telescopici. Ad esempio, immagina una classe con troppi attributi, ma alcuni di essi possono essere impostati come facoltativi. In tal caso, è possibile richiamare il builder solo per impostare gli attributi richiesti e creare un prodotto.
Altri esempi
- L'API Java espone una
StringBuilderclasse che non è strettamente conforme al modello del builder GoF, ma può ancora essere considerata un esempio di essa. La classe StringBuilder fornisce un metodo append che restituisce una nuova stringa aggiungendo caratteri dalla stringa originale. - Un altro esempio ipotetico potrebbe essere la creazione di documenti di tipo pdf o HTML.
Il metodo precedente può apparire in un codice client o server e diversi tipi di documento possono essere creati passando un diverso DocumentBuildernel metodo. Potremmo derivare a HtmlDocumentBuildere a PdfDocumentBuilderdalla classe astratta DocumentBuilder.
Avvertenze
I modelli builder e abstract factory hanno obiettivi simili ma li affrontano in modo diverso. Ad esempio, il modello builder crea oggetti un passo alla volta, mentre la fabbrica astratta restituisce un oggetto in una volta sola.

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































