Stavitel (návrhový vzor)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 23. listopadu 2014; kontroly vyžadují 30 úprav .
Stavitel
Stavitel
Typ Generování
profesionálové

Umožňuje změnit vnitřní reprezentaci produktu. Izoluje kód, který implementuje konstrukci a prezentaci.

Poskytuje jemnější kontrolu nad procesem výstavby než jiné generativní vzory
Související šablony Abstraktní továrna , Linker
Popsáno v Návrhové vzory Ano

Builder – generativní návrhový vzor  poskytuje způsob , jak vytvořit složený objekt.

Účel

Odděluje konstrukci složitého objektu od jeho reprezentace, takže stejný proces výstavby může vést k různým reprezentacím.

Pro

Nevýhody

Aplikace

Moniker objekty v COM jsou Builders, které jsou inicializovány pomocí řetězce. K jejich vytvoření se navíc používá další Builder - MkParseDisplayNameEx, který z řetězce určí zástupnou třídu, vytvoří přezdívku a inicializuje ji stejným řetězcem.

Jeden z těchto objektů, URL Moniker, se používá pro veškeré načítání stránek, příloh a dokumentů v aplikaci Microsoft Internet Explorer.

Příklady

Java

Zdroj Java /** "Produkt" */ class Pizza { private String těsto = "" ; private String sauce = "" ; private String topping = "" ; public void setTough ( String těsto ) { this . těsto = těsto ; } public void setSauce ( Stringová omáčka ) { this . omáčka = omáčka ; } public void setTopping ( String topping ) { this . topping = topping ; } } /** "Abstract Builder" */ abstract class PizzaBuilder { protected Pizza pizza ; public Pizza getPizza () { return pizza ; } public void createNewPizzaProduct () { pizza = new Pizza (); } veřejné abstrakt void buildTough (); public abstract void buildSauce (); public abstract void buildTopping (); } /** "ConcreteBuilder" */ class HawaiianPizzaBuilder rozšiřuje PizzaBuilder { public void buildDough () { pizza . setTough ( "kříž" ); } public void buildSauce () { pizza . setSauce ( "mírná" ); } public void buildTopping () { pizza . setTopping ( "šunka+ananas" ); } } /** "ConcreteBuilder" */ class SpicyPizzaBuilder rozšiřuje PizzaBuilder { public void buildDough () { pizza . setTough ( "pečený na pánvi" ); } public void buildSauce () { pizza . setSauce ( "horká" ); } public void buildTopping () { pizza . setTopping ( "pepperoni+salám" ); } } /** "Ředitel" */ class Číšník { private PizzaBuilder pizzaBuilder ; public void setPizzaBuilder ( PizzaBuilder pb ) { pizzaBuilder = pb ; } public Pizza getPizza () { return pizzaBuilder . getPizza (); } public void constructPizza () { pizzaBuilder . createNewPizzaProduct (); pizzaBuilder . stavětTěsto (); pizzaBuilder . buildSauce (); pizzaBuilder . buildTopping (); } } /** Zákazník, který si objedná pizzu. */ public class BuilderExample { public static void main ( String [] args ) { Číšník číšník = new Číšník (); PizzaBuilder hawaiianPizzaBuilder = nový HawaiianPizzaBuilder (); číšník . setPizzaBuilder ( hawaiianPizzaBuilder ); číšník . konstruktPizza (); Pizza pizza = číšník . getPizza (); } }


Zdroj Java // pattern Builder public class NutritionFacts { private final int serveSize ; soukromé konečné int porce ; soukromé konečné int kalorií ; soukromý konečný int tuk ; private final int sodík ; soukromý konečný int sacharid ; public static class Builder { // Povinné parametry private final int serveSize ; soukromé konečné int porce ; // Další parametry - inicializovány s výchozími hodnotami ​​private int kalorií = 0 ; private int fat = 0 ; private int sacharid = 0 ; private int sodík = 0 ; public Builder ( int serveSize , int serves ) { this . PorceVelikost = PorceVelikost ; toto . porce = porce ; } public Builder kalorie ( int val ) { calorie = val ; vrátit toto ; } public Builder fat ( int val ) { fat = val ; vrátit toto ; } public Builder sacharid ( int val ) { sacharid = val ; vrátit toto ; } public Builder sodík ( int val ) { sodík = val ; vrátit toto ; } public NutritionFacts build () { return new NutritionFacts ( this ); } } private NutritionFacts ( Builder builder ) { serveSize = builder . velikost porce ; porce = stavitel . porce ; kalorie = stavitel . kalorie ; tuk = stavitel . tuk ; sodík = builder . sodík ; sacharid = stavitel . uhlohydráty ; } } // použití NutritionFacts cocaCola = new NutritionFacts . stavitel ( 240 , 8 ) . kalorií ( 100 ) . sodík ( 35 ) . sacharidy ( 27 ) . stavět ();


scala

Zdrojový kód Scala package.com _ package object builder { třída Pizza { private var těsto : String = "" private var omáčka : String = "" private var topping : String = "" def setTough ( těsto : Řetězec ) : Unit = { this . těsto = těsto _ def setSauce ( omáčka : String ) : Unit = { this . omáčka = omáčka _ def setTopping ( topping : String ) : Unit = { this . topping = topping } def outputReceipt () : Unit = { println ( s"Těsto: $ těsto \nOmáčka: $ omáčka \nTopping: $ topping " ) } } abstraktní třída AbstractPizzaBuilder { protected var pizza : Možnost [ Pizza ] = Žádná def getPizza : Možnost [ Pizza ] = pizza def createPizza () : Unit = { pizza = Some ( new Pizza ) } def buildTough () : Unit def buildSauce () : Unit def buildTopping () : Unit } class HawaiianPizzaBuilder rozšiřuje AbstractPizzaBuilder { override def buildTough () : Unit = { pizza . získat _ setTough ( "kříž" ) } override def buildSauce () : Unit = { pizza . získat _ setSauce ( "mild" ) } override def buildTopping () : Unit = { pizza . získat _ setTopping ( "šunka+ananas" ) } } class SpicyPizzaBuilder rozšiřuje AbstractPizzaBuilder { override def buildTough () : Unit = { pizza . získat _ setTough ( "pečený na pánvi" ) } override def buildSauce () : Unit = { pizza . získat _ setSauce ( "horké" ) } override def buildTopping () : Unit = { pizza . získat _ setTopping ( "pepperoni+salám" ) } } třída číšník { private var pizzaBuilder : Možnost [ AbstractPizzaBuilder ] = Žádná def setPizzaBuilder ( pizzaBuilder : AbstractPizzaBuilder ) : Unit = { this . pizzaBuilder = Some ( pizzaBuilder ) println ( s"Builder ${ pizzaBuilder . getClass . getName } je nastaven jako výchozí" ) } def createPizza () : Pizza = { pizzaBuilder . získat _ createPizza () pizzaBuilder . získat _ buildDough () pizzaBuilder . získat _ buildSauce () pizzaBuilder . získat _ buildTopping () pizzaBuilder . získat _ getPizza . získat } } objectBuilderTest { _ def main ( args : Pole [ Řetězec ]) : Jednotka = { val číšník = nový číšník println ( "Výstup:" ) číšník . setPizzaBuilder ( nový HawaiianPizzaBuilder ) číšník . vytvořitPizza (). výstupPříjem () číšník . setPizzaBuilder ( nový SpicyPizzaBuilder ) číšník . vytvořitPizza (). outputReceipt () } } } // Výstup: // Builder com.builder.package$HawaiianPizzaBuilder je nastaven jako výchozí // Těsto: křížové // Omáčka: jemná // Poleva: šunka+ananas // Builder com.builder.package$SpicyPizzaBuilder je nastaven jako výchozí / / Těsto: pečené na pánvi // Omáčka: pálivá // Poleva: feferonky+salám

C#

Zdrojový text v C# pomocí System ; pomocí System.Collections.Generic ; tvůrce jmenného prostoru { public class MainApp { public static void Main () { // Vytvořit ředitele a stavitele Director director = new Director (); Builder b1 = new ConcreteBuilder1 (); Builder b2 = new ConcreteBuilder2 (); // Vytvořte dva produkty director . konstrukt ( bl ); Produkt p1 = b1 . GetResult (); p1 . ukázat (); ředitel . konstrukt ( b2 ); Produkt p2 = b2 . GetResult (); p2 . ukázat (); // Počkejte na uživatelskou konzoli . číst (); } } // "Ředitel" class Director { // Builder používá komplexní sérii kroků public void Construct ( Builder builder ) { builder . BuildPart (); stavitel . BuildPartB (); } } // "Tvůrce" abstract class Builder { public virtual void BuildPartA (){} public virtual void BuildPartB (){} public abstract Product GetResult (); } // "ConcreteBuilder1" class ConcreteBuilder1 : Builder { private readonly Product product = new Product (); public override void BuildPartA () { produkt . Přidat ( "Část A" ); } public override void BuildPartB () { produkt . Přidat ( "Část B" ); } public override Product GetResult () { return product ; } } // "ConcreteBuilder2" class ConcreteBuilder2 : Builder { private readonly Product product = new Product (); public override void BuildPartA () { produkt . Přidat ( "PartX" ); } public override void BuildPartB () { produkt . Přidat ( "Party" ); } public override Product GetResult () { return product ; } } // "Produkt" class Produkt { private readonly List < string > parts = new List < string >(); public void Add ( string part ) { parts . Přidat ( část ); } public void Zobrazit () { Console . WriteLine ( "\nČásti produktu -------" ); foreach ( část strun po částech ) Konzole . WriteLine ( část ); } } }

C++

Zdrojový text v C++ // Implementace v C++. #include <iostream> #include <paměť> #include <řetězec> // Třída produktu Pizza { soukromý : std :: provázkové těsto ; std :: stringsauce ; _ std :: topping string ; veřejnost : Pizza () { } ~ Pizza () { } void SetTough ( const std :: string & d ) { těsto = d ; } void SetSauce ( const std :: string & s ) { omáčka = s ; } void SetTopping ( const std :: string & t ) { topping = t ; } void ShowPizza () { std :: cout << "Mňam!!!" << std :: endl << "Pizza s těstem jako" << těsto << ", Omáčka jako " << omáčka << "a Topping as" << topping << "!!!" << std :: endl ; } }; // Abstraktní třída Builder PizzaBuilder { chráněno : std :: shared_ptr < Pizza > pizza ; veřejnost : PizzaBuilder () {} virtuální ~ PizzaBuilder () {} std :: shared_ptr < Pizza > GetPizza () { return pizza ; } void createNewPizzaProduct () { pizza . reset ( nová Pizza ); } virtuální void buildTough () = 0 ; virtuální void buildSauce () = 0 ; virtuální void buildTopping () = 0 ; }; // Třída ConcreteBuilder HawaiianPizzaBuilder : veřejný PizzaBuilder { veřejnost : HawaiianPizzaBuilder () : PizzaBuilder () {} ~ HawaiianPizzaBuilder (){} void buildTough () { pizza -> SetTough ( "cross" ); } void buildSauce () { pizza -> SetSauce ( "mild" ); } void buildTopping () { pizza -> SetTopping ( "šunka a ananas" ); } }; // Třída ConcreteBuilder SpicyPizzaBuilder : veřejný PizzaBuilder { veřejnost : SpicyPizzaBuilder () : PizzaBuilder () {} ~ SpicyPizzaBuilder () {} void buildTough () { pizza -> SetTough ( "pečeno na pánvi" ); } void buildSauce () { pizza -> SetSauce ( "horká" ); } void buildTopping () { pizza -> SetTopping ( "pepperoni a salám" ); } }; // Třída ředitele číšník { soukromý : PizzaBuilder * pizzaBuilder ; veřejnost : Číšník () : pizzaBuilder ( nullptr ) {} ~ Číšník () { } void SetPizzaBuilder ( PizzaBuilder * b ) { pizzaBuilder = b ; } std :: shared_ptr < Pizza > GetPizza () { return pizzaBuilder -> GetPizza (); } void ConstructPizza () { pizzaBuilder -> createNewPizzaProduct (); pizzaBuilder -> buildTough (); pizzaBuilder -> buildSauce (); pizzaBuilder -> buildTopping (); } }; // Klient si objedná dvě pizzy. int main () { číšník číšník ; HawaiianPizzaBuilder hawaiianPizzaBuilder ; číšník . SetPizzaBuilder ( & hawaiianPizzaBuilder ); číšník . ConstructPizza (); std :: shared_ptr < Pizza > pizza = číšník . GetPizza (); pizza -> ShowPizza (); SpicyPizzaBuilder spicyPizzaBuilder ; číšník . SetPizzaBuilder ( & spicyPizzaBuilder ); číšník . ConstructPizza (); pizza = číšník . GetPizza (); pizza -> ShowPizza (); return EXIT_SUCCESS ; }

JavaScript

Zdrojový kód JavaScriptu // Funkce produktu Pizza () { var duplicate = this ; // konstantní odkaz na vytvořený objekt, který má být volán pro jakýkoli tento var těsto ; var omáčka ; var poleva ; toto . setTough = funkce ( val ) { těsto = val ; }; toto . setSauce = function ( val ) { sauce = val ; }; toto . setTopping = function ( val ) { topping = val ; }; // vzhledem k povaze jazyka musí být getry (i když je nepotřebujeme) // definovány ve stejné funkci jako lokální proměnné this . getTough = function () { return těsto ; }; toto . getSauce = function () { return sauce ; }; toto . getTopping = function () { return topping ; }; // musíme vytvořit metodu, která změní vlastnosti již vytvořeného objektu // (viz createNewPizzaProduct) this . clear = function () { duplicate . setTough ( nedefinováno ); duplikát . setSauce ( undefined ); duplikát . setTopping ( nedefinováno ); }; } // Abstract Builder function PizzaBuilder () { var pizza = new Pizza (); toto . getPizza = function () { return pizza ; }; toto . createNewPizzaProduct = function () { // pokud jen změníme hodnotu proměnné pizza, pak změna // nijak neovlivní podřízené třídy, protože uvnitř nich proměnná pizza // odkazuje na "starou" paměťovou oblast pizza . jasné (); // pokud uvnitř implementací (HawaiianPizzaBuilder, SpicyPizzaBuilder) // místo proměnné pizza použijeme metodu getPizza, // pak můžeme použít // pizza = new Pizza(); // a Pizza nebude potřebovat metodu clear }; toto . buildTough = function ( val ) { }; toto . buildSauce = function ( val ) { }; toto . buildTopping = function ( val ) { }; } // Funkce ConcreteBuilder HawaiianPizzaBuilder () { PizzaBuilder . zavolat ( toto ); var pizza = toto . getPizza (); // simulovat chráněno toto . buildTough = function () { pizza . setTough ( "kříž" ); }; toto . buildSauce = function () { pizza . setSauce ( "mírná" ); }; toto . buildTopping = function () { pizza . setTopping ( "šunka+ananas" ); }; } function SpicyPizzaBuilder () { PizzaBuilder . zavolat ( toto ); var pizza = toto . getPizza (); toto . buildTough = function () { pizza . setTough ( "pečený na pánvi" ); }; toto . buildSauce = function () { pizza . setSauce ( "horká" ); }; toto . buildTopping = function () { pizza . setTopping ( "pepperoni+salám" ); }; } // Funkce ředitele Číšník () { var pizzaBuilder ; toto . setPizzaBuilder = function ( builder ) { pizzaBuilder = builder ; }; toto . getPizza = function () { return pizzaBuilder . getPizza (); }; toto . constructPizza = function () { pizzaBuilder . createNewPizzaProduct (); pizzaBuilder . stavětTěsto (); pizzaBuilder . buildSauce (); pizzaBuilder . buildTopping (); }; } // Zákazník si objedná dvě pizzy var pizza ; var číšník = nový číšník (); var hawaiianPizzaBuilder = new HawaiianPizzaBuilder (); číšník . setPizzaBuilder ( hawaiianPizzaBuilder ); číšník . konstruktPizza (); pizza = číšník . getPizza (); upozornění ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () ); var spicyPizzaBuilder = new SpicyPizzaBuilder (); číšník . setPizzaBuilder ( spicyPizzaBuilder ); číšník . konstruktPizza (); pizza = číšník . getPizza (); upozornění ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );

Python

Zdrojový kód v Pythonu #coding: utf-8 class Zvíře : """ Abstraktní zvíře """ nohy = 0 ocas = Falešný řev = '' class Mutator : """ Zodpovědný za reprodukci """ def mutate ( self ): self . zvíře = zvíře () class Cat ( Mutator ): """ Cat """ def create_legs ( self ): self . zvíře . nohy = 4 def create_tail ( self ): self . zvíře . ocas = pravda def create_roar ( self ): self . zvíře . řev = 'meowww!' třída Pes ( Mutator ): """ Pes """ def create_legs ( self ): self . zvíře . nohy = 4 def create_tail ( self ): self . zvíře . ocas = pravda def create_roar ( self ): self . zvíře . řev = 'woffff!' class AnimalOwner : """ Majitel zvířat """ __mutator = '' def set_animal ( self , mutator ): self . __mutátor = mutátor def create_an_animal_for_me ( self ): self . __mutátor . mutovat () sebe . __mutátor . create_legs () self . __mutátor . create_tail () self . __mutátor . create_roar () def get_animal ( self ): return self . __mutátor . zvíře c = Kočka () d = Pes () ao = Majitel zvířat () ao . set_animal ( c ) ao . create_an_animal_for_me () zvíře = ao . get_animal () tisknout zvíře . řev #meowww !

PHP5

Zdrojový kód PHP <?php /** * Tvůrce vzorů, pracuje se známými "stavebními recepturami" */ /** * Pizza - Základní stavební objekt */ class Pizza { soukromé $_pečivo = "" ; private $_sauce = "" ; private $_garniture = "" ; public function setPastry ( $pečivo ) { $toto -> _pečivo = $pečivo ; } public function setSauce ( $sauce ) { $this -> _sauce = $sauce ; } public function setGarniture ( $garniture ) { $this -> _garniture = $garniture ; } } /** * Builder - Abstraktní stavitel */ abstract class BuilderPizza { chráněná $_pizza ; public function getPizza () { return $this -> _pizza ; } public function createNewPizza () { $this -> _pizza = new Pizza (); } abstraktní veřejná funkce buildPastry (); abstraktní veřejná funkce buildSauce (); abstraktní veřejné funkce buildGarniture (); } /** * BuilderConcret - Tvůrce betonu 1 */ class BuilderPizzaHawaii rozšiřuje BuilderPizza { public function buildPastry () { $this -> _pizza -> setPastry ( "normal" ); } public function buildSauce () { $this -> _pizza -> setSauce ( "měkká" ); } public function buildGarniture () { $this -> _pizza -> setGarniture ( "jambon+ananas" ); } } /** * BuilderConcret - Concrete Builder 2 */ class BuilderPizzaSpicy extends BuilderPizza { public function buildPastry () { $this -> _pizza -> setPastry ( "puff" ); } public function buildSauce () { $this -> _pizza -> setSauce ( "horká" ); } public function buildGarniture () { $this -> _pizza -> setGarniture ( "pepperoni+salám" ); } } /** * Director - Třída Control, která spouští konstrukci * PizzaBuilder - Implementace vzoru Builder, ukazující delegování procesu vytváření pizzy na metodu constructPizza */ class PizzaBuilder { private $_builderPizza ; public function setBuilderPizza ( BuilderPizza $mp ) { $this -> _builderPizza = $mp ; } public function getPizza () { return $this -> _builderPizza -> getPizza (); } public function constructPizza () { $this -> _builderPizza -> createNewPizza (); $this -> _builderPizza -> buildPastry (); $this -> _builderPizza -> buildSauce (); $this -> _builderPizza -> buildGarniture (); } } // Inicializace pizzy $pizzaBuilder = new PizzaBuilder (); // Inicializace dostupných produktů $builderPizzaHawaii = new BuilderPizzaHawaii (); $builderPizzaPicante = new BuilderPizzaSpicy (); // Příprava a získání produktu $pizzaBuilder -> setBuilderPizza ( $builderPizzaHawaii ); $pizzaBuilder -> constructPizza (); $pizza = $pizzaBuilder -> getPizza ();

Ruby

Zdrojový kód Ruby # # Základní stavební objekt # class Pizza attr_accessor :pečivo , :omáčka , :garniture end # # Builder - class builder # class BuilderPizza attr_reader :pizza def create_new_pizza @pizza = Pizza . nový konec def get_pizza "Vaše objednávka. pečivo: #{ @pizza . pečivo } , omáčka: #{ @pizza . omáčka } , garnitura: #{ @pizza . garniture } " konec konec # # BuilderConcret - Concrete builder 1 # class BuilderPizzaHawaii < BuilderPizza def build_pastry @pizza . pečivo = 'normální' konec def build_sauce @pizza . omáčka = ‚měkký‘ konec def build_garniture @pizza . garniture = konec 'jambon+ananas ' # # BuilderConcret - Concrete builder 2 # class BuilderPizzaSpicy < BuilderPizza def build_pastry @pizza . pečivo = 'listový' konec def build_sauce @pizza . omáčka = 'horký' konec def build_garniture @pizza . garnitura = 'papperoni+salám' konec konec # # Director - Třída manažera, která spouští sestavení # class Číšník def set_builder_pizza ( bp ) @builder_pizza = bp end def get_pizza @builder_pizza . get_pizza end def construct_pizza @builder_pizza . create_new_pizza @builder_pizza . build_pastry @builder_pizza . build_sauce @builder_pizza . build_garniture end end číšník = číšník . Nový builder_pizza_hawaii = BuilderPizzaHawaii . new builder_pizza_spicy = BuilderPizzaSpicy . Nový číšník . set_builder_pizza ( builder_pizza_hawaii ) číšník . konstrukt_pizza klade číšníka . get_pizza

Delphi

Zdrojový text v Delphi program BuilderPatternExample ; {$APPTYPE KONZOLE} používá SysUtils ; typ // Produkt TPizza = class ( TObject ) strict private FDough , FSauce , FTopping : string ; veřejný majetek Těsto : řetězec napsat FTěsto ; vlastnost Sauce : string write FSauce ; vlastnost Topping : string write FTopping ; postup Zobrazit ; konec ; // Abstract Builder TPizzaBuilder = class ( TObject ) strict protected FPizza : TPizza ; veřejný majetek Pizza : TPizza číst FPizza ; konstruktor Vytvořit ; destruktor Zničit ; přepsat ; procedura CreateNewPizzaProduct ; postup FreePizzaProdukt ; postup BuildTough ; virtuální ; abstraktní ; postup BuildSauce ; virtuální ; abstraktní ; postup BuildTopping ; virtuální ; abstraktní ; konec ; // Concrete Builder A THawaiianPizzaBuilder = class ( TPizzaBuilder ) public procedure BuildDough ; přepsat ; postup BuildSauce ; přepsat ; postup BuildTopping ; přepsat ; konec ; // Concrete Builder B TSpicyPizzaBuilder = class ( TPizzaBuilder ) public procedure BuildDough ; přepsat ; postup BuildSauce ; přepsat ; postup BuildTopping ; přepsat ; konec ; // Director TWaiter = class ( TObject ) strict private FPizzaBuilder : TPizzaBuilder ; veřejný majetek PizzaBuilder : TPizzaBuilder zápis FPizzaBuilder ; konstruktor Vytvořit ; destruktor Zničit ; přepsat ; postup ConstructPizza ; postup FreePizza ; funkce GetPizza : TPizza ; konec ; {TPizza} postup TPizza . ukázat ; begin WriteLn ( 'Pizza s těstem jako ' + FTěsto + ', omáčka jako ' + FSauce + ' a Poleva jako ' + FTopping + '!' ) ; konec ; {TPizzaBuilder} konstruktor TPizzaBuilder . vytvořit ; begin FPizza := nula ; konec ; destruktor TPizzaBuilder . zničit ; začít FreePizzaProduct ; zděděný Destroy ; konec ; postup TPizzaBuilder . Pizza produkt zdarma ; begin if FPizza <> nil then FreeAndNil ( FPizza ) ; konec ; postup TPizzaBuilder . CreateNewPizzaProduct ; begin if FPizza <> nil then FPizza . zdarma ; FPizza := TPizza . vytvořit ; konec ; {THawaiianPizzaBuilder} postup THawaiianPizzaBuilder . BuildTough ; begin if FPizza <> nil then FPizza . Těsto := 'kříž' ; konec ; postup THawaiianPizzaBuilder . BuildSauce ; begin if FPizza <> nil then FPizza . Omáčka := 'jemná' ; konec ; postup THawaiianPizzaBuilder . BuildTopping ; begin if FPizza <> nil then FPizza . Poleva := 'šunka a ananas' ; konec ; { TSpicyPizzaBuilder } postup TSpicyPizzaBuilder . BuildTough ; begin if FPizza <> nil then FPizza . Těsto := 'pečený na pánvi' ; konec ; postup TSpicyPizzaBuilder . BuildSauce ; begin if FPizza <> nil then FPizza . Omáčka := 'horká' ; konec ; postup TSpicyPizzaBuilder . BuildTopping ; begin if FPizza <> nil then FPizza . Poleva := 'pepperoni a salám' ; konec ; {TWaiter} konstruktér TWaiter . vytvořit ; begin FPizzaBuilder := nil ; konec ; destruktor TWaiter . zničit ; begin FPizzaBuilder := nil ; zděděný Destroy ; konec ; postup Číšník . FreePizza ; begin if FPizzaBuilder <> nula then FPizzaBuilder . Pizza produkt zdarma ; konec ; postup Číšník . Construct Pizza ; begin if FPizzaBuilder <> nil then begin FPizzaBuilder . CreateNewPizzaProduct ; FPizzaBuilder . BuildTough ; FPizzaBuilder . BuildSauce ; FPizzaBuilder . BuildTopping ; konec ; konec ; funkce Číšník . GetPizza : TPizza ; begin if FPizzaBuilder <> nil then Result := FPizzaBuilder . Pizza else Vysledek := nula ; konec ; procedure ConstructAndShowPizza ( Číšník : TWaiter ; Builder : TPizzaBuilder ) ; var Pizza : TPizza ; začít číšník . PizzaBuilder := Stavitel ; číšník . Construct Pizza ; Pizza := Číšník . GetPizza ; zkuste pizzu . ukázat ; konečně číšník . FreePizza ; konec ; konec ; var Číšník : TWaiter ; HawaiianPizzaBuilder : THawaiianPizzaBuilder ; SpicyPizzaBuilder : TSpicyPizzaBuilder ; begin HawaiianPizzaBuilder := nil ; SpicyPizzaBuilder := nil ; Číšník := nula ; zkuste HawaiianPizzaBuilder := THawaiianPizzaBuilder . vytvořit ; SpicyPizzaBuilder := TSpicyPizzaBuilder . vytvořit ; Číšník := Číšník . vytvořit ; // Klient si objednal dvě pizzy ConstructAndShowPizza ( Witer , HawaiianPizzaBuilder ) ; ConstructAndShowPizza ( Číšník , SpicyPizzaBuilder ) ; konečně číšník . zdarma ; HawaiianPizzaBuilder . zdarma ; SpicyPizzaBuilder . zdarma ; konec ; Readln ; konec .

VB.NET

Zdrojový text v jazyce VB.NET Importy System.Collections.Generic Tvůrce jmenného prostoru Public Class MainApp Public Shared Sub Main () ' Vytvořit ředitele a stavitele Ztlumit ředitele Jako nového ředitele () Dim b1 jako stavitel = nový ConcreteBuilder1 () Dim b2 jako stavitel = Nový ConcreteBuilder2 () ' Construct dva produkty ředitel . Konstrukce ( b1 ) Dim p1 As Product = b1 . GetResult () p1 . Zobrazit () ředitel . Konstrukce ( b2 ) Dim p2 As Product = b2 . GetResult () p2 . Zobrazit () ' Počkejte na uživatelskou konzoli . Číst () End Sub End Class ' "Director" Class Director ' Builder používá složitou sérii kroků Public Sub Construct ( ByVal builder As Builder ) builder . BuildPartA () builder . BuildPartB () End Sub End Class ' "Builder" MustInherit Class Builder Public MustOverride Sub BuildPartA () Public MustOverride Sub BuildPartB () Veřejná funkce MustOverride GetResult ( ) As Product End Class ' Třída "ConcreteBuilder1" ConcreteBuilder1 zdědí soukromý produkt pouze pro čtení jako nový produkt () Public Overrides Sub BuildPartA () produkt . Přidat ( "PartA" ) End Sub Public Overrides Sub BuildPartB () produkt . Přidat ( "Část B" ) End Sub Veřejné přepíše funkci GetResult () Jako Product Return Product End Function End Class ' Třída "ConcreteBuilder2" ConcreteBuilder2 zdědí soukromý produkt pouze pro čtení jako nový produkt () Public Overrides Sub BuildPartA () produkt . Přidat ( "PartX" ) End Sub Public Overrides Sub BuildPartB () produkt . Přidat ( "PartY" ) End Sub Veřejné přepíše funkci GetResult () Jako Product Return Product End Function End Class ' Třída "Produkt" Soukromé části pouze pro čtení jako nový seznam ( řetězce )() Public Sub Add ( část ByVal As String ) části . Přidat ( část ) End Sub Veřejná dílčí show () Konzole . WriteLine ( vbLf & "Díly produktu -------" ) Pro každou část jako řetězec v konzole dílů . WriteLine ( část ) Next End Sub End Class End Namespace

Poznámky

Odkazy