Come si confrontano i due approcci?
Intuitivamente, il primo approccio sembra logico: si crea un oggetto vuoto, quindi si riempiono i suoi campi usando metodi appropriati per invocare i setter appropriati e alla fine si restituisce l'oggetto finale.
Ma come sottolineato da Robert Harvey nel suo commento: qual è il vantaggio allora? Perché utilizzare un builder e non creare direttamente l'oggetto e riempire i suoi campi con i metodi appropriati?
Esistono tuttavia casi in cui questo approccio non funziona. Ad esempio, se il tuo complesso oggetto SomeClass
ha solo costruttori che richiedono parametri che devono essere prima creati. In questo caso, è necessario prima creare i parametri del costruttore e quindi, alla fine, richiamare il costruttore. Qui, solo il secondo approccio può essere previsto.
In effetti questo secondo approccio sembra essere una tecnica popolare quando un costruttore ha troppi parametri .
Qual è lo scopo del modello di progettazione del builder?
In base al GoF , l'intento del modello di builder è:
separate the construction of a complex object from its representation,
so that the same construction process can create different
representations.
L'idea è di costruire un oggetto passo dopo passo con:
- un'interfaccia builder astratta per la creazione delle parti,
- costruttori di calcestruzzo che implementano questa interfaccia passo passo per rappresentazioni specifiche e offrono una funzione per assemblare e ottenere il prodotto finale,
- un director che ottiene il builder concreto per iniezione e lo invoca per creare le parti come richiesto.
In che modo il tuo builder si relaziona al modello di progettazione di Builder?
Entrambi gli approcci (e specialmente il secondo) sono costruttori, nel senso che costruiscono oggetti. Il secondo è leggermente più flessibile.
Tuttavia, nessuno di questi è builder secondo il GoF: qui non c'è astrazione del builder che possa dettare un'interfaccia di costruzione standardizzata su più classi che obbediscono alla stessa logica di costruzione. Mi chiedo quindi se valga davvero la complessità aggiunta, specialmente se il costruttore non accetta argomenti e i diversi oggetti previsti non sono troppo complessi da costruire.