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

Miinukset

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

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

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

C#

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 ); } } }

C++

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

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 () );

Python

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 !

PHP5

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 ();

Ruby

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

Delphi

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 .

VB.NET

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