Rakentaja (suunnittelukuvio)
Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 23. marraskuuta 2014 tarkistetusta
versiosta . tarkastukset vaativat
30 muokkausta .
Rakentaja |
---|
Rakentaja |
Tyyppi |
Luodaan |
Plussat |
Mahdollistaa tuotteen sisäisen esityksen muuttamisen. Eristää koodin, joka toteuttaa rakentamisen ja esityksen.
Antaa tarkemman hallinnan rakennusprosessille kuin muut generatiiviset kuviot |
Aiheeseen liittyvät mallit |
Abstract Factory , Linker |
Kuvattu suunnittelukuvioissa |
Joo |
Builder – Generatiivinen suunnittelukuvio tarjoaa tavan luoda yhdistelmäobjekti.
Tarkoitus
Erottaa monimutkaisen objektin rakentamisen sen esityksestä siten, että sama rakennusprosessi voi johtaa erilaisiin esityksiin.
Plussat
- voit muuttaa tuotteen sisäistä esitystapaa;
- eristää koodin, joka toteuttaa rakentamisen ja esittämisen;
- antaa tarkemman hallinnan suunnitteluprosessista.
Miinukset
- monimutkaisen objektin luomisalgoritmi ei saisi riippua siitä, mistä osista objekti koostuu ja kuinka ne sopivat yhteen;
- rakentamisprosessin tulee tarjota erilaisia esityksiä rakennettavasta kohteesta.
Sovellus
Moniker - objektit COM :ssa ovat rakentajia, jotka alustetaan merkkijonolla. Lisäksi niiden luomiseen käytetään toista Builderia - MkParseDisplayNameEx, joka määrittää monikeriluokan merkkijonosta, luo monikerin ja alustaa sen samalla merkkijonolla.
Yhtä näistä objekteista, URL Monikeria, käytetään kaikkeen sivujen, liitteiden ja asiakirjojen lataamiseen Microsoft Internet Explorerissa.
Esimerkkejä
Java lähde
/** "Tuote" */
luokka Pizza {
yksityinen String taikina = "" ;
yksityinen String kastike = "" ;
private String topping = "" ;
public void setDough ( String taikina ) { this . taikina = taikina ; }
public void setSauce ( String kastike ) { this . kastike = kastike ; }
public void setTopping ( String topping ) { this . täyte = täyttö ; } }
/** "Abstract Builder" */
abstrakti luokka PizzaBuilder {
suojattu pizza pizza ;
julkinen Pizza getPizza () { paluu pizza ; }
public void createNewPizzaProduct () { pizza = uusi pizza (); }
julkinen abstrakti void buildDough ();
julkinen abstrakti void buildSauce ();
julkinen abstrakti void buildTopping ();
}
/** "ConcreteBuilder" */
luokka HawaiianPizzaBuilder laajentaa PizzaBuilder {
public void buildDough () { pizza . setDough ( "risti" ); }
public void buildSauce () { pizza . setSauce ( "mieto" ); }
public void buildTopping () { pizza . setTopping ( "kinkku+ananas" ); }
}
/** "ConcreteBuilder" */
luokka SpicyPizzaBuilder laajentaa PizzaBuilder {
public void buildDough () { pizza . setDough ( "pannussa" ); }
public void buildSauce () { pizza . setSauce ( "kuuma" ); }
public void buildTopping () { pizza . setTopping ( "pepperoni+salami" ); }
}
/** "Johtaja" */
luokka Tarjoilija {
yksityinen PizzaBuilder pizzaBuilder ;
public void setPizzaBuilder ( PizzaBuilder pb ) { pizzaBuilder = pb ; }
julkinen Pizza getPizza () { return pizzaBuilder . getPizza (); }
public void constructPizza () {
pizzaBuilder . luoUusiPizzaTuote ();
pizzan rakentaja . buildDough ();
pizzan rakentaja . buildSauce ();
pizzan rakentaja . buildTopping ();
}
}
/** Asiakas tilaamassa pizzaa. */
public class Rakennusesimerkki {
public static void main ( String [] args ) {
Tarjoilija = new Waiter ( ); PizzaBuilder hawaiianPizzaBuilder = uusi HawaiianPizzaBuilder (); tarjoilija . setPizzaBuilder ( hawaiianPizzaBuilder ); tarjoilija . rakentaaPizza ();
Pizza pizza = tarjoilija . getPizza ();
}
}
Java lähde
// malli Builder
public class NutritionFacts {
private final int servingSize ;
yksityiset lopulliset int annokset ;
yksityinen lopullinen int kalorit ;
yksityinen lopullinen int fat ;
yksityinen lopullinen int natrium ;
yksityinen lopullinen hiilihydraatti ; _
public static class Builder {
// Vaaditut parametrit
private final int servingSize ;
yksityiset lopulliset int annokset ;
// Lisäparametrit - alustettu oletusarvoilla
yksityinen int kalorit = 0 ;
yksityinen int rasva = 0 ;
yksityinen int hiilihydraatti = 0 ;
yksityinen int natrium = 0 ;
public Builder ( int servingSize , int servings ) {
this . servingSize = tarjoilukoko ;
tämä . annokset = annokset ;
}
public Builder kalorit ( int val ) {
kalorit = val ;
palauta tämä ;
}
public Builder fat ( int val ) {
fat = val ;
palauta tämä ;
}
public Builder carbohydrate ( int val ) {
carbohydrate = val ;
palauta tämä ;
}
public Builder natrium ( int val ) {
natrium = val ;
palauta tämä ;
}
public NutritionFacts build () {
return new NutritionFacts ( this );
}
}
yksityinen NutritionFacts ( Builder builder ) {
servingSize = builder . tarjoilukoko ;
annokset = rakentaja . annokset ;
kalorit = rakentaja . kalorit ;
rasva = rakentaja . rasvaa ;
natrium = rakentaja . natrium ;
hiilihydraatti = rakentaja . hiilihydraatti ;
}
}
// käyttö
NutritionFacts cocaCola = new NutritionFacts
. rakentaja ( 240 , 8 )
. kaloreita ( 100 )
. natrium ( 35 )
. hiilihydraatti ( 27 )
. rakentaa ();
Scala lähdekoodi
package.com _
pakettiobjektin rakentaja { _
luokan pizza {
yksityinen var taikina : String = ""
yksityinen var kastike : String = ""
yksityinen var täytettä : String = ""
def setDough ( taikina : merkkijono ) : Yksikkö = {
tämä . taikina = taikina
_
def setSauce ( kastike : String ) : Yksikkö = {
this . kastike = kastike
_
def setTopping ( topping : String ) : Yksikkö = {
tämä . täyte = täyttö }
def outputReceipt () : Yksikkö = {
println ( s"Taikina: $ taikina \nKastike: $ kastike \nLiite: $ täyte " ) } }
abstrakti luokka AbstractPizzaBuilder {
suojattu var pizza : Vaihtoehto [ Pizza ] = Ei mitään
def getPizza : Vaihtoehto [ Pizza ] = pizza
def createPizza () : Yksikkö = {
pizza = Jotkut ( uusi pizza )
}
def buildDough () : Yksikkö
def build kastike () : Yksikkö
def buildTopping () : Yksikkö
}
class HawaiianPizzaBuilder laajentaa AbstractPizzaBuilder {
ohittaa def buildDough () : Yksikkö = {
pizza . saada . setDough ( "risti" )
}
override def buildSauce () : Yksikkö = {
pizza . saada . setSauce ( "mieto" )
}
ohita def buildTopping () : Yksikkö = {
pizza . saada . setTopping ( "kinkku+ananas" )
}
}
class SpicyPizzaBuilder laajentaa AbstractPizzaBuilder {
ohittaa def buildDough () : Yksikkö = {
pizza . saada . setDough ( "pannussa" )
}
override def buildSauce () : Yksikkö = {
pizza . saada . setSauce ( "kuuma" )
}
ohita def buildTopping () : Yksikkö = {
pizza . saada . setTopping ( "pippuri+salami" )
}
}
luokan tarjoilija {
yksityinen var pizzaBuilder : Vaihtoehto [ AbstractPizzaBuilder ] = Ei mitään
def setPizzaBuilder ( pizzaBuilder : AbstractPizzaBuilder ) : Yksikkö = {
tämä . pizzaBuilder = Jotkut ( pizzaBuilder )
println ( s"Builder ${ pizzaBuilder . getClass . getName } on asetettu oletukseksi" )
}
def createPizza () : Pizza = {
pizzaBuilder . saada . luoPizza ()
pizzaBuilder . saada . buildDough ()
pizzaBuilder . saada . buildSauce ()
pizzaBuilder . saada . buildTopping ()
pizzaBuilder . saada . hanki Pizza . hanki
}
}
objectBuilderTest { _
def main ( args : Array [ String ]) : Yksikkö = {
val waiter = new Waiter
println ( "Tuloste:" )
tarjoilija . setPizzaBuilder ( uusi HawaiianPizzaBuilder )
tarjoilija . luoPizza (). outputReceipt ()
tarjoilija . setPizzaBuilder ( uusi SpicyPizzaBuilder )
tarjoilija . luoPizza (). lähtökuitti ()
}
}
}
// Tulostus:
// Builder com.builder.package$HawaiianPizzaBuilder on asetettu oletukseksi
// Taikina: risti
// Kastike: mieto
// Täyte: kinkku+ananas
// Builder com.builder.package$SpicyPizzaBuilder on asetettu oletukseksi
/ / Taikina: pannulla paistettu
// Kastike: kuuma
// Täyte: pepperoni+salami
Lähdeteksti C#
käyttäen System ;
käyttäen System.Collections.Generic ;
nimitilan rakentaja
{
public class MainApp
{
public static void Main ()
{
// Luo johtaja ja rakentajat
Johtaja johtaja = uusi johtaja ();
Rakentaja b1 = uusi ConcreteBuilder1 ();
Builder b2 = uusi ConcreteBuilder2 ();
// Rakenna kaksi tuotetta
johtaja . Rakenne ( bl );
Tuote p1 = b1 . GetResult ();
p1 . näytä ();
ohjaaja . Rakenne ( b2 );
Tuote p2 = b2 . GetResult ();
p2 . näytä ();
// Odota käyttäjän
konsolia . lue ();
}
}
// "Ohjaaja"
class Director
{
// Builder käyttää monimutkaista vaihesarjaa
public void Construct ( Builder builder )
{
builder . Rakennusosa ();
rakentaja . BuildPartB ();
}
}
// "Rakentaja"
abstrakti class Builder
{
public virtual void BuildPartA (){}
public virtual void BuildPartB (){}
public abstrakti Tuote GetResult ();
}
// "ConcreteBuilder1"
luokka ConcreteBuilder1 : Rakentaja
{
yksityinen luku vain Tuotetuote = uusi tuote ( ) ;
public override void BuildPartA ()
{
tuote . Lisää ( "PartA" );
}
public override void BuildPartB ()
{
tuote . Lisää ( "OsaB" );
}
public override Tuote GetResult ()
{
palauttaa tuote ;
}
}
// "ConcreteBuilder2"
luokka ConcreteBuilder2 : Rakentaja
{
yksityinen luku vain Tuotetuote = uusi tuote ( ) ;
public override void BuildPartA ()
{
tuote . Lisää ( "PartX" );
}
public override void BuildPartB ()
{
tuote . Lisää ( "Juhla" );
}
public override Tuote GetResult ()
{
palauttaa tuote ;
}
}
// "Tuote"
class Tuote
{
yksityinen vain luku List < string > osat = new List < string >();
public void Lisää ( merkkijono osa )
{
osat . Lisää ( osa );
}
public void Näytä ()
{
Konsoli . WriteLine ( "\nTuoteosat -------" );
foreach ( merkkijono osissa ) Konsoli . _ _ WriteLine ( osa ); } } }
Lähdeteksti C++:ssa
// Toteutus C++:ssa.
#include <iostream>
#sisällytä <muisti>
#sisällytä <merkkijono>
//
Tuoteluokka Pizza
{
yksityinen :
std :: string taikina ;
std :: stringkastike ; _
std :: merkkijono ; _
julkinen :
Pizza () { }
~ Pizza () { }
void SetDough ( const std :: string & d ) { taikina = d ; }
void SetSauce ( const std :: string & s ) { kastike = s ; }
void SetTopping ( const std :: string & t ) { topping = t ; }
mitätön ShowPizza ()
{
std :: cout << "Namia!!!" << std :: endl
<< "Pizza taikinalla" << taikina
<< ", Kastike " << kastike
<< "ja Täyte" << täyte
<< "!!!" << std :: endl ;
}
};
// Abstract Builder
-luokka PizzaBuilder
{
suojattu :
std :: share_ptr < Pizza > pizza ;
julkinen :
PizzaBuilder () {}
virtuaalinen ~ PizzaBuilder () {}
std :: shared_ptr < Pizza > GetPizza () { paluu pizza ; }
void createNewPizzaProduct () { pizza . nollaa ( uusi pizza ); }
virtuaalinen void buildDough () = 0 ;
virtuaalinen void buildSauce () = 0 ;
virtuaalinen void buildTopping () = 0 ;
};
// ConcreteBuilder -
luokka HawaiianPizzaBuilder : julkinen PizzaBuilder
{
julkinen :
HawaiianPizzaBuilder () : PizzaBuilder () {}
~ HawaiianPizzaBuilder (){}
void buildDough () { pizza -> SetDough ( "risti" ); }
void buildSauce () { pizza -> SetSauce ( "mieto" ); }
void buildTopping () { pizza -> SetTopping ( "kinkku ja ananas" ); }
};
// ConcreteBuilder -
luokka SpicyPizzaBuilder : julkinen PizzaBuilder
{
julkinen :
SpicyPizzaBuilder () : PizzaBuilder () {}
~ SpicyPizzaBuilder () {}
void buildDough () { pizza -> SetDough ( "pannussa paistettu" ); }
void buildSauce () { pizza -> SetSauce ( "kuuma" ); }
void buildTopping () { pizza -> SetTopping ( "pepperoni ja salami" ); }
};
//
Ohjaajaluokka Tarjoilija
{
yksityinen :
PizzaBuilder * pizzaBuilder ;
julkinen :
Tarjoilija () : pizzaBuilder ( nullptr ) {}
~ Tarjoilija () { }
void SetPizzaBuilder ( PizzaBuilder * b ) { pizzaBuilder = b ; }
std :: shared_ptr < Pizza > GetPizza () { return pizzaBuilder -> GetPizza (); }
mitätön ConstructPizza ()
{
pizzaBuilder -> CreateNewPizzaProduct ();
pizzaBuilder -> buildDough ();
pizzaBuilder -> buildSauce ();
pizzaBuilder -> buildTopping ();
}
};
// Asiakas tilaa kaksi pizzaa.
int main ()
{
Tarjoilija tarjoilija ;
HawaiianPizzaBuilder hawaiianPizzaBuilder ;
tarjoilija . SetPizzaBuilder ( & hawaiianPizzaBuilder );
tarjoilija . RakennaPizza ();
std :: share_ptr < Pizza > pizza = tarjoilija . GetPizza ();
pizza -> ShowPizza ();
SpicyPizzaBuilder spicyPizzaBuilder ;
tarjoilija . SetPizzaBuilder ( & spicyPizzaBuilder );
tarjoilija . RakennaPizza ();
pizza = tarjoilija . GetPizza ();
pizza -> ShowPizza ();
paluu EXIT_SUCCESS ;
}
JavaScript lähdekoodi
// Tuotefunktio
Pizza ( ) {
var duplicate = this ; // jatkuva viittaus instantoituun objektiin, jota kutsutaan tämän
var taikinan yhteydessä ;
var- kastike ;
var täytettä ;
tämä . setDough = funktio ( val ) {
taikina = val ;
};
tämä . setSauce = function ( val ) {
kastike = val ;
};
tämä . setTopping = funktio ( val ) {
topping = val ;
};
// kielen luonteesta johtuen getterit (vaikka emme niitä tarvitsisi)
// täytyy määritellä samassa funktiossa kuin paikalliset muuttujat
this . getDough = funktio () {
palauta taikina ;
};
tämä . getSauce = function () {
return kastike ;
};
tämä . getTopping = function () {
paluu täyte ;
};
// meidän on luotava menetelmä, joka muuttaa jo luodun objektin ominaisuuksia
// (katso createNewPizzaProduct)
tämä . clear = function () {
kaksoiskappale . setDough ( määrittelemätön );
kaksoiskappale . setSauce ( määrittelemätön );
kaksoiskappale . setTopping ( määrittelemätön );
};
}
// Abstract Builder
-toiminto PizzaBuilder () {
var pizza = uusi Pizza ();
tämä . getPizza = function () {
return pizza ;
};
tämä . createNewPizzaProduct = funktio () {
// jos muutamme vain pizzamuuttujan arvoa, muutos
// ei vaikuta lapsiluokkiin millään tavalla, koska niiden sisällä muuttuva pizza
// viittaa "vanhaan" muistialueen
pizzaan . selkeä ();
// jos toteutuksissa (HawaiianPizzaBuilder, SpicyPizzaBuilder)
// käytämme getPizza-menetelmää pizzamuuttujan sijasta,
// voimme käyttää
// pizza = new Pizza();
// ja Pizza ei tarvitse selkeää menetelmää
};
tämä . buildDough = funktio ( val ) { };
tämä . buildSauce = funktio ( val ) { };
tämä . buildTopping = funktio ( val ) { };
}
// ConcreteBuilder -
toiminto HawaiianPizzaBuilder () {
PizzaBuilder . soita ( tämä );
var pizza = tämä . getPizza (); // simuloi suojattu
tämä . buildDough = function () { pizza . setDough ( "risti" ); };
tämä . buildSauce = function () { pizza . setSauce ( "mieto" ); };
tämä . buildTopping = function () { pizza . setTopping ( "kinkku+ananas" ); };
}
function SpicyPizzaBuilder () {
PizzaBuilder . soita ( tämä );
var pizza = tämä . getPizza ();
tämä . buildDough = function () { pizza . setDough ( "pannussa" ); };
tämä . buildSauce = function () { pizza . setSauce ( "kuuma" ); };
tämä . buildTopping = function () { pizza . setTopping ( "pepperoni+salami" ); };
}
//
Ohjaustoiminto Tarjoilija () {
var pizzaBuilder ;
tämä . setPizzaBuilder = toiminto ( rakentaja ) {
pizzaBuilder = rakentaja ;
};
tämä . getPizza = function () {
return pizzaBuilder . getPizza ();
};
tämä . constructPizza = function () {
pizzaBuilder . luoUusiPizzaTuote ();
pizzan rakentaja . buildDough ();
pizzan rakentaja . buildSauce ();
pizzan rakentaja . buildTopping ();
};
}
// Asiakas tilaa kaksi pizzaa
var pizza ;
var tarjoilija = uusi Tarjoilija ();
var hawaiianPizzaBuilder = uusi HawaiianPizzaBuilder ();
tarjoilija . setPizzaBuilder ( hawaiianPizzaBuilder );
tarjoilija . rakentaaPizza ();
pizza = tarjoilija . getPizza ();
hälytys ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );
var spicyPizzaBuilder = uusi SpicyPizzaBuilder ();
tarjoilija . setPizzaBuilder ( spicyPizzaBuilder );
tarjoilija . rakentaaPizza ();
pizza = tarjoilija . getPizza ();
hälytys ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );
Lähdekoodi Pythonissa
#koodaus: utf-8
luokka Eläin :
"""
Abstrakti eläin
"""
jalat = 0
häntä = väärä
karjunta = ''
luokka Mutaattori :
"""
Vastaa lisääntymisestä
"""
def mutate ( self ):
itse . eläin = eläin ()
luokka Kissa ( Mutaattori ):
"""
Kissa
"""
def create_legs ( self ):
itse . eläin . jalat = 4
def create_tail ( itse ):
itse . eläin . häntä = Totta
def create_roar ( itse ):
itse . eläin . roar = 'meowww!'
luokka Koira ( Mutaattori ):
"""
Koira
"""
def create_legs ( self ):
itse . eläin . jalat = 4
def create_tail ( itse ):
itse . eläin . häntä = Totta
def create_roar ( itse ):
itse . eläin . roar = 'woffff!'
luokka AnimalOwner :
""" Eläimen
omistaja
"""
__mutator = ''
def set_animal ( itse , mutaattori ):
itse . __mutaattori = mutaattori
def create_an_animal_for_me ( itse ):
itse . __mutaattori . muuttaa ()
itsensä . __mutaattori . create_legs ()
self . __mutaattori . create_tail ()
self . __mutaattori . create_roar ()
def get_animal ( itse ):
palauta itse . __mutaattori . eläin
c = Kissa ()
d = Koira ()
ao = Eläimenomistaja ()
ao . set_animal ( c )
jne . create_an_animal_for_me ()
animal = ao . get_animal ()
tulosta eläin . karjua #meowww !
PHP lähdekoodi
<?php
/**
* Kuvionrakentaja, toimii tunnetuilla "rakennusresepteillä"
*/
/**
* Pizza - Pohjarakennusobjekti
*/
luokka Pizza {
yksityinen $_pastry = "" ;
yksityinen $_sauce = "" ;
yksityinen $_garniture = "" ;
public function setPastry ( $pastry ) {
$this -> _pastry = $leivonnainen ;
}
julkinen funktio setSauce ( $kastike ) {
$this -> _sauce = $kastike ;
}
public function setGarniture ( $garniture ) {
$this -> _garniture = $garniture ;
}
}
/**
* Builder - Abstract builder
*/
abstract class BuilderPizza {
suojattu $_pizza ;
public function getPizza () {
return $this -> _pizza ;
}
public function createNewPizza () {
$this -> _pizza = uusi pizza ();
}
abstrakti julkinen toiminto buildPastry ();
abstrakti julkinen toiminto buildSauce ();
abstrakti julkinen tehtävä rakentaaGarniture ();
}
/**
* BuilderConcret - Concrete builder 1
*/
luokka BuilderPizzaHawaii laajentaa BuilderPizzaa {
public function buildPastry () {
$this -> _pizza -> setPastry ( "normaali" );
}
public function buildSauce () {
$this -> _pizza -> setSauce ( "pehmeä" );
}
public function buildGarniture () {
$this -> _pizza -> setGarniture ( "jambon+ananas" );
}
}
/**
* BuilderConcret - Concrete builder 2
*/
luokka BuilderPizzaSpicy laajentaa BuilderPizzaa {
public function buildPastry () {
$this -> _pizza -> setPastry ( "puff" );
}
public function buildSauce () {
$this -> _pizza -> setSauce ( "hot" );
}
public function buildGarniture () {
$this -> _pizza -> setGarniture ( "pepperoni+salami" );
}
}
/**
* Ohjaaja - Rakentamisen
aloittava ohjausluokka * PizzaBuilder - Builder-mallin toteutus, joka näyttää pizzan luomisprosessin delegoinnin constructPizza-menetelmään
*/
luokka PizzaBuilder {
yksityinen $_builderPizza ;
public function setBuilderPizza ( BuilderPizza $mp )
{
$this -> _builderPizza = $mp ;
}
public function getPizza ()
{
return $this -> _builderPizza -> getPizza ();
}
julkinen funktio constructPizza () {
$this -> _builderPizza -> createNewPizza ();
$this -> _builderPizza -> buildPastry ();
$this -> _builderPizza -> buildSauce ();
$this -> _builderPizza -> buildGarniture ();
}
}
// Pizzan alustus
$pizzaBuilder = uusi PizzaBuilder ();
// Alusta saatavilla olevat tuotteet
$builderPizzaHawaii = uusi BuilderPizzaHawaii ();
$builderPizzaPicante = uusi BuilderPizzaSpicy ();
// Tuotteen valmistelu ja
hankkiminen $pizzaBuilder -> setBuilderPizza ( $builderPizzaHawaii );
$pizzaBuilder -> constructPizza ();
$pizza = $pizzaBuilder -> getPizza ();
Rubyn lähdekoodi
#
# Pohjarakennusobjekti
#
luokka Pizza
attr_accessor :leivonnaiset , :kastike , :garniture
end
#
# Builder - luokan rakentaja
#
luokka BuilderPizza
attr_reader :pizza
def create_new_pizza
@pizza = Pizza . uusi
loppu
def get_pizza
"Tilauksesi. leivonnainen: #{ @pizza . leivonnainen } , kastike: #{ @pizza . kastike } , koristelu: #{ @pizza . garniture } "
loppu
loppu
#
# BuilderConcret - Concrete builder 1
#
luokka BuilderPizzaHawaii < BuilderPizza
def build_pastry
@pizza . leivonnainen = 'normaali'
loppu
def build_sauce
@pizza . kastike = 'pehmeä'
pää
def build_garniture
@pizza . garniture = 'jambon+ananas
' loppupää
#
# BuilderConcret - Concrete builder 2
#
luokka BuilderPizzaSpicy < BuilderPizza
def build_pastry
@pizza . leivonnainen = 'puhvi'
loppu
def build_sauce
@pizza . kastike = 'kuuma'
loppu
def build_garniture
@pizza . garniture = 'papperoni+salami
' loppupää
#
# Ohjaaja - Esimiesluokka, joka aloittaa rakentamisen
#
luokka Tarjoilija
def set_builder_pizza ( bp )
@builder_pizza = bp
end
def get_pizza
@builder_pizza . get_pizza
end
def construct_pizza
@builder_pizza . luo_uusi_pizza
@builder_pizza . build_pastry
@builder_pizza . build_kastike
@builder_pizza . build_garniture
end
end
tarjoilija = tarjoilija . Uusi
builder_pizza_hawaii = RakentajaPizzaHawaii . new
builder_pizza_spicy = RakentajaPizzaSpicy . Uusi
tarjoilija . set_builder_pizza ( builder_pizza_hawaii )
tarjoilija . construct_pizza
laittaa tarjoilijan . get_pizza
Lähdeteksti Delphissä
ohjelma BuilderPatternExample ;
{$APPTYPE CONSOLE}
käyttää
SysUtilsia ;
tyyppi
// Tuote
TPizza = luokka ( TObject )
tiukka yksityinen
FDough , FSauce , FTopping : merkkijono ;
julkinen
omaisuus Taikina : merkkijono kirjoittaa FDough ;
ominaisuus Kastike : merkkijono kirjoittaa FSauce ;
ominaisuus Topping : merkkijono kirjoitus FTopping ;
menettely Näytä ;
loppu ;
// Abstract Builder
TPizzaBuilder = luokka ( TObject )
tiukasti suojattu
FPizza : TPizza ;
julkinen
omaisuus Pizza : TPizza read FPizza ;
rakentaja Luo ;
tuhoaja Tuhoa ; ohittaa ;
menettely CreateNewPizzaProduct ;
menettely FreePizzaProduct ;
menettely BuildDough ; virtuaalinen ; abstrakti ;
menettely BuildSauce ; virtuaalinen ; abstrakti ;
menettely BuildTopping ; virtuaalinen ; abstrakti ;
loppu ;
// Concrete Builder A
THawaiianPizzaBuilder = luokka ( TPizzaBuilder )
julkinen
menettely BuildDough ; ohittaa ;
menettely BuildSauce ; ohittaa ;
menettely BuildTopping ; ohittaa ;
loppu ;
// Concrete Builder B
TSpicyPizzaBuilder = luokka ( TPizzaBuilder )
julkinen
menettely BuildDough ; ohittaa ;
menettely BuildSauce ; ohittaa ;
menettely BuildTopping ; ohittaa ;
loppu ;
// Ohjaaja
TWaiter = luokka ( TObject )
tiukka yksityinen
FPizzaBuilder : TPizzaBuilder ;
julkinen
omaisuus PizzaBuilder : TPizzaBuilder kirjoittaa FPIzzaBuilder ;
rakentaja Luo ;
tuhoaja Tuhoa ; ohittaa ;
menettely ConstructPizza ;
menettely FreePizza ;
toiminto GetPizza : TPizza ;
loppu ;
{TPizza}
menettely TPizza . näytä ;
begin
WriteLn ( 'Pizza taikinalla nimellä ' + FDough + ', kastike nimellä ' + FSauce + ' ja topping kuin ' + FTopping + '!' ) ;
loppu ;
{TPizzaBuilder}
rakentaja TPizzaBuilder . luoda ;
aloita
FPizza := nolla ;
loppu ;
tuhoaja TPizzaBuilder . Tuhoa ;
Aloita
FreePizzaProduct ;
perinnöllinen Destroy ;
loppu ;
menettely TPizzaBuilder . Ilmainen pizzatuote ;
aloita
jos FPizza <> nil then
FreeAndNil ( FPizza ) ;
loppu ;
menettely TPizzaBuilder . LuoUusiPizzaTuote ;
aloita
jos FPizza <> nolla sitten
FPizza . Ilmainen ;
FPizza := TPizza . luoda ;
loppu ;
{THawaiianPizzaBuilder}
menettely THawaiianPizzaBuilder . BuildDough ;
aloita
jos FPizza <> nolla sitten
FPizza . Taikina := 'risti' ;
loppu ;
menettely THawaiianPizzaBuilder . BuildSauce ;
aloita
jos FPizza <> nolla sitten
FPizza . Kastike := 'mieto' ;
loppu ;
menettely THawaiianPizzaBuilder . BuildTopping ;
aloita
jos FPizza <> nolla sitten
FPizza . Täyte := 'kinkku ja ananas' ;
loppu ;
{ TSpicyPizzaBuilder }
menettely TSpicyPizzaBuilder . BuildDough ;
aloita
jos FPizza <> nolla sitten
FPizza . Taikina := 'pannussa paistettu' ;
loppu ;
menettely TSpicyPizzaBuilder . BuildSauce ;
aloita
jos FPizza <> nolla sitten
FPizza . Kastike := 'kuuma' ;
loppu ;
menettely TSpicyPizzaBuilder . BuildTopping ;
aloita
jos FPizza <> nolla sitten
FPizza . Täyte := 'pepperoni ja salami' ;
loppu ;
{Ttarjoilija}
rakentaja TWaiter . luoda ;
aloita
FPizzaBuilder := nolla ;
loppu ;
destructor TWaiter . Tuhoa ;
aloita
FPizzaBuilder := nolla ;
perinnöllinen Destroy ;
loppu ;
menettely TTarjoilija . Ilmainen pizza ;
aloita
jos FPIzzaBuilder <> nolla sitten
FPIzzaBuilder . Ilmainen pizzatuote ;
loppu ;
menettely TTarjoilija . Rakenna Pizza ;
aloita
jos FPizzaBuilder <> nolla sitten
aloita
FPIzzaBuilder . LuoUusiPizzaTuote ;
FPizzaBuilder . BuildDough ;
FPizzaBuilder . BuildSauce ;
FPizzaBuilder . BuildTopping ;
loppu ;
loppu ;
toiminto TWaiter . GetPizza : TPizza ;
aloita
jos FPIzzaBuilder <> nolla sitten
Tulos := FPizzaBuilder . Pizza
muu
Tulos := nolla ;
loppu ;
menettely ConstructAndShowPizza ( tarjoilija : TWaiter ; rakentaja : TPizzaBuilder ) ;
var
Pizza : TPizza ;
aloita
tarjoilija . PizzaBuilder := Rakentaja ;
tarjoilija . Rakenna Pizza ;
Pizza := Tarjoilija . GetPizza ;
kokeile
pizzaa . näytä ;
vihdoin
tarjoilija . Ilmainen pizza ;
loppu ;
loppu ;
var
Tarjoilija : TWaiter ;
HawaiianPizzaBuilder : THawaiianPizzaBuilder ;
SpicyPizzaBuilder : TSpicyPizzaBuilder ;
aloita
HawaiianPizzaBuilder := nolla ;
SpicyPizzaBuilder := nolla ;
Tarjoilija := nolla ;
kokeile
HawaiianPizzaBuilder := THawaiianPizzaBuilder . luoda ;
SpicyPizzaBuilder := TSpicyPizzaBuilder . luoda ;
Tarjoilija := TTarjoilija . luoda ;
// Asiakas on tilannut kaksi pizzaa
ConstructAndShowPizza ( Waiter , HawaiianPizzaBuilder ) ;
ConstructAndShowPizza ( tarjoilija , SpicyPizzaBuilder ) ;
vihdoin
tarjoilija . Ilmainen ;
HawaiianPizzaBuilder . Ilmainen ;
SpicyPizzaBuilder . Ilmainen ;
loppu ;
Readln ;
loppua .
Lähdeteksti VB.NET-kielellä
Imports System.Collections.Generic
Nimitilan rakentaja
Julkinen luokka MainApp
Julkinen jaettu alipää () ' Luo johtaja ja rakentajat Himmeä johtaja uutena johtajana ()
Dim b1 Rakentajana = Uusi ConcreteBuilder1 ( ) Dim b2 Rakentajana = Uusi ConcreteBuilder2 ( )
' Rakenna kaksi tuotetta
johtaja . Rakenne ( b1 )
Dim p1 Tuotteena = b1 . _ GetResult () p1 . Näytä ()
ohjaaja . Rakenne ( b2 )
Dim p2 Tuloksena = b2 . _ GetResult () p2 . Näytä ()
Odota käyttäjäkonsolia . Lue ()
Lopeta Sub
End Class
' "Director"
Class Director
' Builder käyttää monimutkaista vaihesarjaa
Public Sub Construct ( ByVal builder As Builder )
rakentaja . BuildPartA ()
rakentaja . BuildPartB ()
End Sub
End Class
' "Builder"
on perittävä luokan Builder
Public MustOverride Sub BuildPartA ()
Public MustOverride Sub BuildPartB ()
Julkinen MustOverride Function GetResult ( ) Tuotteen loppuluokkana
' "ConcreteBuilder1"
Luokka ConcreteBuilder1
perii Builderin
yksityisen , vain luku -tuotteen uutena tuotteena ()
Julkinen ohittaa Sub BuildPartA ()
-tuotteen . Lisää ( "PartA" )
End Sub
Julkinen ohittaa Sub BuildPartB ()
tuotteen . Lisää ( "OsaB" )
End Sub
Julkinen ohittaa funktion GetResult ( ) Tuotteena Palautustuotteen Lopputoiminto Loppuluokka _ _ _
"ConcreteBuilder2"
-luokka ConcreteBuilder2
perii Builderin
yksityisen , vain luku -tuotteen uutena tuotteena ()
Julkinen ohittaa Sub BuildPartA ()
-tuotteen . Lisää ( "PartX" )
End Sub
Julkinen ohittaa Sub BuildPartB ()
tuotteen . Lisää ( "PartY" )
End Sub
Julkinen ohittaa funktion GetResult ( ) Tuotteena Palautustuotteen Lopputoiminto Loppuluokka _ _ _
' "Tuote"
-luokan tuote
Yksityiset vain luku -osat uutena luettelona ( merkkijonosta ) ( )
Public Sub Add ( ByVal part As String )
osat . Lisää ( osa )
End Sub
Julkinen Sub Show ()
Konsoli . WriteLine ( vbLf & " Tuoteosat -------" )
Jokaiselle osalle String In parts -konsolina . WriteLine ( osa ) Next End Sub End Class End Namespace
Muistiinpanot
Linkit