Builder: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
FrescoBot (discussione | contributi)
m Bot: standardizzazione nome sezione e modifiche minori
Riga 10:
Ciò ha l'effetto immediato di rendere più semplice la classe, permettendo a una classe builder separata di focalizzarsi sulla corretta costruzione di un'istanza e lasciando che la classe originale si concentri sul funzionamento degli oggetti. Questo è particolarmente utile quando volete assicurarvi che un oggetto sia valido prima di istanziarlo, e non volete che la logica di controllo appaia nei costruttori degli oggetti.
Un builder permette anche di costruire un oggetto passo-passo, cosa che si può verificare quando si fa il parsing di un testo o si ottengono i parametri da un'interfaccia interattiva.
 
== Struttura di un Builder ==
* '''Builder''': specifica l'interfaccia astratta che crea le parti dell'oggetto Product.
Riga 27:
* il Builder si focalizza sulla costruzione di un oggetto complesso "step by step". Abstract Factory enfatizza una famiglia di oggetti (sia semplici che complessi). Il Builder restituisce il prodotto come passo finale del processo di creazione, mentre per quanto riguarda l' Abstract Factory, il prodotto viene ritornato immediatamente.
* Builder spesso costruisce un Composite.
* In genere, il design procede nel modo seguente: parte utilizzando il pattern Factory Method (meno complicato, più customizzabile, ma che genera una proliferazione di sottoclassi) ed evolve verso Abstract Factory, Prototype, oppure Builder (più flessibili, più complessi) nel momento in cui il progettista scopre la necessità di una maggiore flessibilità.
* Spesso i pattern creazionali sono complementari: Builder può infatti utilizzare uno degli altri pattern per implementare le componenti che deve costruire. Abstract Factory, Builder, e Prototype possono utilizzare il Singleton nelle loro implementazioni.
 
Riga 338:
 
Product
 
<span style="color:#808000">interface</span> pizza
<span style="color:#808000">predicates</span>
setDough : <span style="color:#993300">(</span>string <span style="color:#008000">Dough</span><span style="color:#993300">)</span>.
setSauce : <span style="color:#993300">(</span>string <span style="color:#008000">Sauce</span><span style="color:#993300">)</span>.
setTopping : <span style="color:#993300">(</span>string <span style="color:#008000">Topping</span><span style="color:#993300">)</span>.
<span style="color:#808000">end</span> <span style="color:#808000">interface</span> pizza
 
<span style="color:#808000">class</span> pizza : pizza
<span style="color:#808000">end</span> <span style="color:#808000">class</span> pizza
 
<span style="color:#808000">implement</span> pizza
<span style="color:#808000">facts</span>
dough : string := <span style="color:#0000FF">""</span>.
sauce : string := <span style="color:#0000FF">""</span>.
topping : string := <span style="color:#0000FF">""</span>.
<span style="color:#808000">clauses</span>
setDough<span style="color:#993300">(</span><span style="color:#008000">Dough</span><span style="color:#993300">)</span> :- dough := <span style="color:#008000">Dough</span>.
<span style="color:#808000">clauses</span>
setSauce<span style="color:#993300">(</span><span style="color:#008000">Sauce</span><span style="color:#993300">)</span> :- sauce := <span style="color:#008000">Sauce</span>.
<span style="color:#808000">clauses</span>
setTopping<span style="color:#993300">(</span><span style="color:#008000">Topping</span><span style="color:#993300">)</span> :- topping := <span style="color:#008000">Topping</span>.
<span style="color:#808000">end</span> <span style="color:#808000">implement</span> pizza
 
Abstract Builder
 
<span style="color:#808000">interface</span> pizzaBuilder
<span style="color:#808000">predicates</span>
getPizza : <span style="color:#993300">()</span> -&gt; pizza <span style="color:#008000">Pizza</span>.
createNewPizzaProduct : <span style="color:#993300">()</span>.
<span style="color:#808000">predicates</span>
buildDough : <span style="color:#993300">()</span>.
buildSauce : <span style="color:#993300">()</span>.
buildTopping : <span style="color:#993300">()</span>.
<span style="color:#808000">end</span> <span style="color:#808000">interface</span> pizzaBuilder
 
Visual Prolog non supporta le classi astratte, ma possiamo creare una classe di supporto:
 
<span style="color:#808000">interface</span> pizzaBuilderSupport
<span style="color:#808000">predicates</span> <span style="color:#333399">from</span> pizzaBuilder
getPizza, createNewPizzaProduct
<span style="color:#808000">end</span> <span style="color:#808000">interface</span> pizzaBuilderSupport
 
<span style="color:#808000">class</span> pizzaBuilderSupport : pizzaBuilderSupport
<span style="color:#808000">end</span> <span style="color:#808000">class</span> pizzaBuilderSupport
 
<span style="color:#808000">implement</span> pizzaBuilderSupport
<span style="color:#808000">facts</span>
pizza : pizza := <span style="color:#333399">erroneous</span>.
<span style="color:#808000">clauses</span>
getPizza<span style="color:#993300">()</span> = pizza.
<span style="color:#808000">clauses</span>
createNewPizzaProduct<span style="color:#993300">()</span> :- pizza := pizza::new<span style="color:#993300">()</span>.
<span style="color:#808000">end</span> <span style="color:#808000">implement</span> pizzaBuilderSupport
 
ConcreteBuilder #1
 
<span style="color:#808000">class</span> hawaiianPizzaBuilder : pizzaBuilder
<span style="color:#808000">end</span> <span style="color:#808000">class</span> hawaiianPizzaBuilder
 
<span style="color:#808000">implement</span> hawaiianPizzaBuilder
<span style="color:#808000">inherits</span> pizzaBuilderSupport
 
<span style="color:#808000">clauses</span>
buildDough<span style="color:#993300">()</span> :- getPizza<span style="color:#993300">()</span>:setDough<span style="color:#993300">(</span><span style="color:#0000FF">"cross"</span><span style="color:#993300">)</span>.
<span style="color:#808000">clauses</span>
buildSauce<span style="color:#993300">()</span> :- getPizza<span style="color:#993300">()</span>:setSauce<span style="color:#993300">(</span><span style="color:#0000FF">"mild"</span><span style="color:#993300">)</span>.
<span style="color:#808000">clauses</span>
buildTopping<span style="color:#993300">()</span> :- getPizza<span style="color:#993300">()</span>:setTopping<span style="color:#993300">(</span><span style="color:#0000FF">"ham+pineapple"</span><span style="color:#993300">)</span>.
<span style="color:#808000">end</span> <span style="color:#808000">implement</span> hawaiianPizzaBuilder
 
ConcreteBuilder #2
 
<span style="color:#808000">class</span> spicyPizzaBuilder : pizzaBuilder
<span style="color:#808000">end</span> <span style="color:#808000">class</span> spicyPizzaBuilder
 
<span style="color:#808000">implement</span> spicyPizzaBuilder
<span style="color:#808000">inherits</span> pizzaBuilderSupport
 
<span style="color:#808000">clauses</span>
buildDough<span style="color:#993300">()</span> :- getPizza<span style="color:#993300">()</span>:setDough<span style="color:#993300">(</span><span style="color:#0000FF">"pan baked"</span><span style="color:#993300">)</span>.
<span style="color:#808000">clauses</span>
buildSauce<span style="color:#993300">()</span> :- getPizza<span style="color:#993300">()</span>:setSauce<span style="color:#993300">(</span><span style="color:#0000FF">"hot"</span><span style="color:#993300">)</span>.
<span style="color:#808000">clauses</span>
buildTopping<span style="color:#993300">()</span> :- getPizza<span style="color:#993300">()</span>:setTopping<span style="color:#993300">(</span><span style="color:#0000FF">"pepperoni+salami"</span><span style="color:#993300">)</span>.
<span style="color:#808000">end</span> <span style="color:#808000">implement</span> spicyPizzaBuilder
 
Director
 
<span style="color:#808000">interface</span> waiter
<span style="color:#808000">predicates</span>
setPizzaBuilder : <span style="color:#993300">(</span>pizzaBuilder <span style="color:#008000">PizzaBuilder</span><span style="color:#993300">)</span>.
getPizza : <span style="color:#993300">()</span> -&gt; pizza <span style="color:#008000">Pizza</span>.
<span style="color:#808000">predicates</span>
constructPizza : <span style="color:#993300">()</span>.
<span style="color:#808000">end</span> <span style="color:#808000">interface</span> waiter
 
<span style="color:#808000">class</span> waiter : waiter
<span style="color:#808000">end</span> <span style="color:#808000">class</span> waiter
 
<span style="color:#808000">implement</span> waiter
<span style="color:#808000">facts</span>
pizzaBuilder : pizzaBuilder := <span style="color:#333399">erroneous</span>.
<span style="color:#808000">clauses</span>
setPizzaBuilder<span style="color:#993300">(</span><span style="color:#008000">PizzaBuilder</span><span style="color:#993300">)</span> :- pizzaBuilder := <span style="color:#008000">PizzaBuilder</span>.
<span style="color:#808000">clauses</span>
getPizza<span style="color:#993300">()</span> = pizzaBuilder:getPizza<span style="color:#993300">()</span>.
<span style="color:#808000">clauses</span>
constructPizza<span style="color:#993300">()</span> :-
pizzaBuilder:createNewPizzaProduct<span style="color:#993300">()</span>,
pizzaBuilder:buildDough<span style="color:#993300">()</span>,
pizzaBuilder:buildSauce<span style="color:#993300">()</span>,
pizzaBuilder:buildTopping<span style="color:#993300">()</span>.
<span style="color:#808000">end</span> <span style="color:#808000">implement</span> waiter
 
A customer ordering a pizza.
 
<span style="color:#808000">goal</span>
<span style="color:#008000">Hawaiian_pizzabuilder</span> = hawaiianPizzaBuilder::new<span style="color:#993300">()</span>,
<span style="color:#008000">Waiter</span> = waiter::new<span style="color:#993300">()</span>,
<span style="color:#008000">Waiter</span>:setPizzaBuilder<span style="color:#993300">(</span><span style="color:#008000">Hawaiian_pizzabuilder</span><span style="color:#993300">)</span>,
<span style="color:#008000">Waiter</span>:constructPizza<span style="color:#993300">()</span>,
<span style="color:#008000">Pizza</span> = <span style="color:#008000">Waiter</span>:getPizza<span style="color:#993300">()</span>.
 
Riga 628:
*{{cita libro|Erich | Gamma | design patterns elements of reusable object-oriented software| | | |altri=Richard Helm,Ralph Johnson,John Vlissides}}
 
==ExternalCollegamenti linksesterni==
*Dai costruttori al Builder Pattern in Java [http://www.cosenonjaviste.it/dai-costruttori-al-builder-pattern-in-java/] articolo su http://www.cosenonjaviste.it