Builder: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
m Altri progetti: Aggiunto il parametro "Preposizione" nel template "Interprogetto"
 
(28 versioni intermedie di 23 utenti non mostrate)
Riga 1:
{{F|informaticalinguaggi di programmazione|dicembre 2010}}
Nella [[Programmazione orientata agli oggetti|programmazione ad oggetti]], il '''Builder''' è uno dei pattern fondamentali, definiti originariamente dalla [[gangGang of fourFour (scrittori)|Gang of Four]] (combriccolabanda dei quattro).
 
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 [[assemblaggio|assemblate]].
 
[[File:Builder2.png|thumb|250px|right|Builder Pattern|alt=|riquadrato]]
 
Quindi il pattern BUILDER separa la costruzione di un oggetto complesso dalla sua rappresentazione. 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'interfacciala classe astratta che crea le parti dell'oggetto Product.
* '''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 ritornarestituisce 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.
<syntaxhighlight lang="java" line="1">
 
/** "Prodotto" */
== Esempi ==
class Pizza {
 
private String dough = "";
=== Java ===
private String sauce = "";
<source lang="java">
private String topping = "";
/** "Prodotto" */
public void setDough(String dough) {
class Pizza
this.dough = dough;
{
}
private String dough = "";
privatepublic void setSauce(String sauce) ={ "";
private String topping this.sauce = ""sauce;
}
public void setDough(String dough)
public void setTopping(String topping) {
{ this.dough = dough; }
this.topping = topping;
public void setSauce(String sauce)
}
{ this.sauce = sauce; }
public void setTopping(String topping)
{ this.topping = topping; }
}
</syntaxhighlight><syntaxhighlight lang="java" line="1">
 
/** "Abstract Builder" */
 
abstract class PizzaBuilder {
/** "Abstract Builder" */
protected Pizza pizza;
abstract class PizzaBuilder
public Pizza getPizza() {
{
protected Pizza pizza;
public Pizza getPizza()
{
return pizza;
}
public void createNewPizzaProduct() {
pizza = new Pizza();
{
pizza = new Pizza();}
public abstract void buildDough();
}
public abstract void buildSauce();
public abstract void buildDoughbuildTopping();
public abstract void buildSauce();
public abstract void buildTopping();
}
</syntaxhighlight><syntaxhighlight lang="java" line="1">
 
/** "ConcreteBuilder" */
class HawaiianPizzaBuilder extends PizzaBuilder {
public void buildDough() {
{
pizza.setDough("cross");
public void buildDough()
{ }
public void pizza.setDoughbuildSauce("cross"); {
}
public void buildSauce()
{
pizza.setSauce("mild");
}
public void buildTopping() {
{
pizza.setTopping("ham+pineapple");
}
}
</syntaxhighlight><syntaxhighlight lang="java">
 
/** "ConcreteBuilder" */
class SpicyPizzaBuilder extends PizzaBuilder {
public void buildDough() {
{
public void buildDough()
{
pizza.setDough("pan baked");
}
public void buildSauce() {
pizza.setSauce("hot");
{
pizza.setSauce("hot");}
public void buildTopping() {
}
pizza.setTopping("pepperoni+salami");
public void buildTopping()
{ }
pizza.setTopping("pepperoni+salami");
}
}
</syntaxhighlight><syntaxhighlight lang="java" line="1">
 
/** "Director" */
 
class Cook {
/** "Director" */
class Cook
private PizzaBuilder pizzaBuilder;
{
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
public void setPizzaBuilder(PizzaBuilder pb)
{ }
pizzaBuilder = pb;
public Pizza getPizza() {
}
public Pizza return pizzaBuilder.getPizza();
{ }
return pizzaBuilder.getPizza();
public void constructPizza() {
}
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough();
public void constructPizza()
pizzaBuilder.buildSauce();
{
pizzaBuilder.createNewPizzaProductbuildTopping();
pizzaBuilder.buildDough();}
}
pizzaBuilder.buildSauce();
</syntaxhighlight><syntaxhighlight lang="java" line="1">
pizzaBuilder.buildTopping();
/** A given type of pizza being constructed. */
}
class BuilderExample {
}
public static void main(String[] args) {
 
/** 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>
</source>
 
=== C# ===
<source lang="csharp">
//Implementazione in C#.
class Pizza
{
string dough;
string sauce;
string topping;
public Pizza() {}
public void SetDough( string d){ dough = d;}
public void SetSauce( string s){ sauce = s;}
public void SetTopping( string t){ topping = t;}
}
 
//Abstract Builder
abstract class PizzaBuilder
{
protected Pizza pizza;
public PizzaBuilder(){}
public Pizza GetPizza(){ return pizza; }
public void CreateNewPizza() { pizza = new Pizza(); }
 
public abstract void BuildDough();
public abstract void BuildSauce();
public abstract void BuildTopping();
}
 
//Concrete Builder
class HawaiianPizzaBuilder : PizzaBuilder
{
public override void BuildDough() { pizza.SetDough("cross"); }
public override void BuildSauce() { pizza.SetSauce("mild"); }
public override void BuildTopping() { pizza.SetTopping("ham+pineapple"); }
}
 
//Concrete Builder
class SpicyPizzaBuilder : PizzaBuilder
{
public override void BuildDough() { pizza.SetDough("pan baked"); }
public override void BuildSauce() { pizza.SetSauce("hot"); }
public override void BuildTopping() { pizza.SetTopping("pepparoni+salami"); }
}
 
/** "Director" */
class Waiter {
private PizzaBuilder pizzaBuilder;
 
public void SetPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; }
public Pizza GetPizza() { return pizzaBuilder.GetPizza(); }
 
public void ConstructPizza() {
pizzaBuilder.CreateNewPizza();
pizzaBuilder.BuildDough();
pizzaBuilder.BuildSauce();
pizzaBuilder.BuildTopping();
}
}
 
/** Un cliente che ordina una pizza. */
class BuilderExample
{
public static void Main(String[] args) {
Waiter waiter = new Waiter();
PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();
 
waiter.SetPizzaBuilder ( hawaiianPizzaBuilder );
waiter.ConstructPizza();
 
Pizza pizza = waiter.GetPizza();
}
}
 
</source>
 
=== C++ ===
<source lang="cpp">
// Implementation in C++.
 
#include <iostream>
#include <memory>
#include <string>
 
// Product
class Pizza
{
private:
std::string dough;
std::string sauce;
std::string topping;
public:
Pizza() { }
~Pizza() { }
 
void SetDough(const std::string& d) { dough = d; };
void SetSauce(const std::string& s) { sauce = s; };
void SetTopping(const std::string& t) { topping = t; }
 
void ShowPizza()
{
std::cout << " Yummy !!!" << std::endl
<< "Pizza with Dough as " << dough
<< ", Sauce as " << sauce
<< " and Topping as " << topping
<< " !!! " << std::endl;
}
};
 
// Abstract Builder
class PizzaBuilder
{
protected:
std::auto_ptr<Pizza> pizza;
public:
PizzaBuilder() {}
virtual ~PizzaBuilder() {}
std::auto_ptr<Pizza> GetPizza() { return pizza; }
 
void createNewPizzaProduct() { pizza.reset (new Pizza); }
 
virtual void buildDough()=0;
virtual void buildSauce()=0;
virtual void buildTopping()=0;
};
 
// ConcreteBuilder
class HawaiianPizzaBuilder : public PizzaBuilder
{
public:
HawaiianPizzaBuilder() : PizzaBuilder() {}
~HawaiianPizzaBuilder(){}
 
void buildDough() { pizza->SetDough("cross"); }
void buildSauce() { pizza->SetSauce("mild"); }
void buildTopping() { pizza->SetTopping("ham and pineapple"); }
};
 
// ConcreteBuilder
class SpicyPizzaBuilder : public PizzaBuilder
{
public:
SpicyPizzaBuilder() : PizzaBuilder() {}
~SpicyPizzaBuilder() {}
 
void buildDough() { pizza->SetDough("pan baked"); }
void buildSauce() { pizza->SetSauce("hot"); }
void buildTopping() { pizza->SetTopping("pepperoni and salami"); }
};
 
// Director
class Waiter
{
private:
PizzaBuilder* pizzaBuilder;
public:
Waiter() : pizzaBuilder(NULL) {}
~Waiter() { }
void SetPizzaBuilder(PizzaBuilder* b) { pizzaBuilder = b; }
std::auto_ptr<Pizza> GetPizza() { return pizzaBuilder->GetPizza(); }
void ConstructPizza()
{
pizzaBuilder->createNewPizzaProduct();
pizzaBuilder->buildDough();
pizzaBuilder->buildSauce();
pizzaBuilder->buildTopping();
}
};
// A customer ordering a pizza.
int main()
{
Waiter waiter;
HawaiianPizzaBuilder hawaiianPizzaBuilder;
waiter.SetPizzaBuilder (&hawaiianPizzaBuilder);
waiter.ConstructPizza();
std::auto_ptr<Pizza> pizza = waiter.GetPizza();
pizza->ShowPizza();
SpicyPizzaBuilder spicyPizzaBuilder;
waiter.SetPizzaBuilder(&spicyPizzaBuilder);
waiter.ConstructPizza();
pizza = waiter.GetPizza();
pizza->ShowPizza();
return EXIT_SUCCESS;
}
</source>
 
=== [[Visual Prolog]] ===
 
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>.
 
=== perl ===
<source lang="perl">
## Product
package pizza;
 
sub new {
return bless {
dough => undef,
sauce => undef,
topping => undef
}, shift;
}
 
sub set_dough {
my( $self, $dough ) = @_;
$self->{dough} = $dough;
}
 
sub set_sauce {
my( $self, $sauce ) = @_;
$self->{sauce} = $sauce;
}
 
sub set_topping {
my( $self, $topping ) = @_;
$self->{topping} = $topping;
}
 
1;
 
 
## Abstract builder
package pizza_builder;
 
sub new {
return bless {
pizza => undef
}, shift;
}
 
sub get_pizza {
my( $self ) = @_;
return $self->{pizza};
}
 
sub create_new_pizza_product {
my( $self ) = @_;
$self->{pizza} = pizza->new;
}
 
# This is what an abstract method could look like in perl...
 
sub build_dough {
croak("This method must be overridden.");
}
 
sub build_sauce {
croak("This method must be overridden.");
}
 
sub build_topping {
croak("This method must be overridden.");
}
 
1;
 
 
## Concrete builder
package hawaiian_pizza_builder;
 
use base qw{ pizza_builder };
 
sub build_dough {
my( $self ) = @_;
$self->{pizza}->set_dough("cross");
}
 
sub build_sauce {
my( $self ) = @_;
$self->{pizza}->set_sauce("mild");
}
 
sub build_topping {
my( $self ) = @_;
$self->{pizza}->set_topping("ham+pineapple");
}
 
1;
 
 
## Concrete builder
package spicy_pizza_builder;
 
use base qw{ pizza_builder };
 
sub build_dough {
my( $self ) = @_;
$self->{pizza}->set_dough("pan baked");
}
 
sub build_sauce {
my( $self ) = @_;
$self->{pizza}->set_sauce("hot");
}
 
sub build_topping {
my( $self ) = @_;
$self->{pizza}->set_topping("pepperoni+salami");
}
 
1;
 
 
## Director
package waiter;
 
sub new {
return bless {
pizza_builder => undef
}, shift;
}
 
sub set_pizza_builder {
my( $self, $builder ) = @_;
$self->{pizza_builder} = $builder;
}
 
sub get_pizza {
my( $self ) = @_;
return $self->{pizza_builder}->get_pizza;
}
 
sub construct_pizza {
my( $self ) = @_;
$self->{pizza_builder}->create_new_pizza_product;
$self->{pizza_builder}->build_dough;
$self->{pizza_builder}->build_sauce;
$self->{pizza_builder}->build_topping;
}
 
1;
 
 
## Lets order pizza (client of Director/Builder)
package main;
 
my $waiter = waiter->new;
my $hawaiian_pb = hawaiian_pizza_builder->new;
my $spicy_pb = spicy_pizza_builder->new;
 
$waiter->set_pizza_builder( $hawaiian_pb );
$waiter->construct_pizza;
 
my $pizza = $waiter->get_pizza;
 
print "Serving a nice pizza with:\n";
while (my ($k, $v) = each %$pizza) {
print " $v $k\n";
}
 
1;
</source>
 
==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==
{{Design Patterns Patterns}}
*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}}
[[Categoria:Pattern]]
{{Portale|informatica}}
 
[[Categoria:Design pattern]]
[[bg:Строител (шаблон)]]
[[ca:Builder]]
[[de:Erbauer (Entwurfsmuster)]]
[[en:Builder pattern]]
[[es:Builder (patrón de diseño)]]
[[fr:Monteur (patron de conception)]]
[[ja:Builder パターン]]
[[ko:빌더 패턴]]
[[pl:Budowniczy (wzorzec projektowy)]]
[[pt:Builder]]
[[ru:Строитель (шаблон проектирования)]]
[[uk:Будівник (шаблон проектування)]]
[[zh:生成器 (设计模式)]]