Builder: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m r2.7.3) (Robot: Modifico zh:生成器 (设计模式) in zh:生成器模式 |
m →Altri progetti: Aggiunto il parametro "Preposizione" nel template "Interprogetto" |
||
(23 versioni intermedie di 18 utenti non mostrate) | |||
Riga 1:
{{F|
Nella [[Programmazione orientata agli oggetti|programmazione ad oggetti]], il '''Builder''' è uno dei pattern fondamentali, definiti originariamente dalla [[
Il [[design pattern]] Builder, nella programmazione ad oggetti, separa la costruzione di un oggetto complesso dalla sua rappresentazione cosicché il processo di costruzione stesso possa creare diverse rappresentazioni.
L'algoritmo per la creazione di un oggetto complesso è indipendente dalle varie parti che costituiscono l'oggetto e da come vengono
[[File:Builder2.png
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
* '''ConcreteBuilder''': costruisce e assembla le parti del prodotto implementando l'interfaccia Builder; definisce e tiene traccia della rappresentazione che crea.
* '''Director''': costruisce un oggetto utilizzando l'interfaccia Builder.
Riga 21:
== Funzionamento ==
Il Client crea un oggetto Director e lo configura con gli oggetti Builder desiderati. Il Director notifica al Builder se una parte del prodotto deve essere costruita, il Builder riceve le richieste dal Director e aggiunge le parti al prodotto. Il Client riceve il prodotto dal Builder tramite il Director.
Questo consente di variare la rappresentazione interna del prodotto, isolare il codice per la costruzione e la rappresentazione e controllare in modo preciso il processo di costruzione.
* 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'
* 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
* 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.
<syntaxhighlight lang="java" line="1">
/** "Prodotto" */
class Pizza {
private String dough = "";
private String sauce = "";
private String topping = "";
public void setDough(String dough) {
this.dough = dough;
}
}
public void setTopping(String topping) {
this.topping = topping;
}
}
</syntaxhighlight><syntaxhighlight lang="java" line="1">
/** "Abstract Builder" */
abstract class PizzaBuilder {
protected Pizza pizza;
public Pizza getPizza() {
return pizza;
}
public void createNewPizzaProduct() {
pizza = new Pizza();
public abstract void buildDough();
public abstract void buildSauce();
public abstract void
}
</syntaxhighlight><syntaxhighlight lang="java" line="1">
/** "ConcreteBuilder" */
class HawaiianPizzaBuilder extends PizzaBuilder {
public void buildDough() {
pizza.setDough("cross");
public void
pizza.setSauce("mild");
}
public void buildTopping() {
pizza.setTopping("ham+pineapple");
}
}
</syntaxhighlight><syntaxhighlight lang="java">
/** "ConcreteBuilder" */
class SpicyPizzaBuilder extends PizzaBuilder {
public void buildDough() {
pizza.setDough("pan baked");
}
public void buildSauce() {
pizza.setSauce("hot");
public void buildTopping() {
pizza.setTopping("pepperoni+salami");
}
</syntaxhighlight><syntaxhighlight lang="java" line="1">
/** "Director" */
class Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
public Pizza getPizza() {
public void constructPizza() {
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.
}
</syntaxhighlight><syntaxhighlight lang="java" line="1">
/** A given type of pizza being constructed. */
class BuilderExample {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();
cook.setPizzaBuilder( hawaiianPizzaBuilder );
cook.constructPizza();
Pizza pizza = cook.getPizza();
}
}
</syntaxhighlight>
==Bibliografia==
*{{cita libro|Erich | Gamma | design patterns elements of reusable object-oriented software| | | |altri=Richard Helm,Ralph Johnson,John Vlissides}}
== Voci correlate ==
Riga 633 ⟶ 128:
== Altri progetti ==
{{interprogetto|commons|preposizione=sul}}
==Collegamenti esterni==
*Dai costruttori al Builder Pattern in Java [http://www.cosenonjaviste.it/dai-costruttori-al-builder-pattern-in-java/] {{Webarchive|url=https://web.archive.org/web/20130211093018/http://www.cosenonjaviste.it/dai-costruttori-al-builder-pattern-in-java/ |date=11 febbraio 2013 }} articolo su http://www.cosenonjaviste.it {{Webarchive|url=https://web.archive.org/web/20121215020728/http://www.cosenonjaviste.it/ |date=15 dicembre 2012 }}
{{Design pattern}}
{{Portale|informatica}}
[[Categoria:Design pattern]]
|