Builder (designmönster)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 23 november 2014; kontroller kräver 30 redigeringar .
Byggare
Byggare
Sorts Alstrande
fördelar

Låter dig ändra den interna representationen av produkten. Isolerar kod som implementerar konstruktion och presentation.

Ger finare kontroll över byggprocessen än andra generativa mönster
Relaterade mallar Abstrakt fabrik , Linker
Beskrivs i Design Patterns Ja

Builder - Ett generativt  designmönster ger ett sätt att skapa ett sammansatt objekt.

Syfte

Separerar konstruktionen av ett komplext objekt från dess representation så att samma konstruktionsprocess kan resultera i olika representationer.

Fördelar

Nackdelar

Applikation

Moniker- objekt i COM är Builders som initieras med en sträng. Dessutom, för att skapa dem, används en annan Builder - MkParseDisplayNameEx, som bestämmer monikerklassen från strängen, skapar monikern och initierar den med samma sträng.

Ett av dessa objekt, URL Moniker, används för att ladda alla sidor, bilagor och dokument i Microsoft Internet Explorer.

Exempel

Java

Java-källa /** "Produkt" */ klass Pizza { privat Stringdeg = " " ; privat strängsås = " " ; privat String topping = "" ; public void setDough ( String dough ) { this . deg = deg ; } public void setSauce ( String sauce ) { this . sås = sås ; } public void setTopping ( String topping ) { this . topping = topping ; } } /** "Abstract Builder" */ abstrakt klass PizzaBuilder { protected Pizza pizza ; public Pizza getPizza () { return pizza ; } public void createNewPizzaProduct () { pizza = new Pizza (); } offentlig abstrakt void buildDough (); offentlig abstrakt void buildSauce (); public abstract void buildTopping (); } /** "ConcreteBuilder" */ klass HawaiianPizzaBuilder utökar PizzaBuilder { public void buildDough () { pizza . setDough ( "kors" ); } public void buildSauce () { pizza . setSauce ( "mild" ); } public void buildTopping () { pizza . setTopping ( "skinka+ananas" ); } } /** "ConcreteBuilder" */ klass SpicyPizzaBuilder utökar PizzaBuilder { public void buildDough () { pizza . setDough ( "pannbakad" ); } public void buildSauce () { pizza . setSauce ( "het" ); } public void buildTopping () { pizza . setTopping ( "pepperoni+salami" ); } } /** "Direktör" */ klass Servitör { privat PizzaBuilder pizzaBuilder ; public void setPizzaBuilder ( PizzaBuilder pb ) { pizzaBuilder = pb ; } public Pizza getPizza () { return pizzaBuilder . getPizza (); } public void constructPizza () { pizzaBuilder . createNewPizzaProduct (); pizzabyggare . byggdeg (); pizzabyggare . buildSauce (); pizzabyggare . buildTopping (); } } /** En kund som beställer en pizza. */ public class BuilderExample { public static void main ( String [] args ) { Waiter waiter = new Waiter ( ); PizzaBuilder hawaiianPizzaBuilder = ny HawaiianPizzaBuilder (); servitör . setPizzaBuilder ( hawaiianPizzaBuilder ); servitör . constructPizza (); Pizza pizza = servitör . getPizza (); } }


Java-källa // pattern Builder public class NutritionFacts { private final int serveringSize ; privata sista int servings ; privata slutliga int kalorier ; privat slutlig int fett ; privat final int natrium ; privat slutlig int kolhydrat ; public static class Builder { // Obligatoriska parametrar private final int servingSize ; privata sista int servings ; // Ytterligare parametrar - initierade med standardvärden privata int kalorier = 0 ; privat int fett = 0 ; privat int kolhydrat = 0 ; privat int natrium = 0 ; public Builder ( int servingsSize , int servings ) { detta . serveringsstorlek = serveringsstorlek ; detta . portioner = portioner ; } public Builder calories ( int val ) { calories = val ; returnera detta ; } public Builder fat ( int val ) { fat = val ; returnera detta ; } public Builder carbohydrate ( int val ) { carbohydrate = val ; returnera detta ; } public Builder sodium ( int val ) { sodium = val ; returnera detta ; } public NutritionFacts build () { return new NutritionFacts ( this ); } } privat NutritionFacts ( Builder builder ) { servingSize = builder . serveringsstorlek ; portioner = byggmästare . portioner ; kalorier = byggare . kalorier ; fett = byggare . fett ; natrium = byggsubstans . natrium ; kolhydrat = byggare . kolhydrater ; } } // användning NutritionFacts cocaCola = nya NutritionFacts . byggmästare ( 240 , 8 ) . kalorier ( 100 ) . natrium ( 35 ) . kolhydrater ( 27 ) . bygga ();


scala

Scala källkod package.com _ paketobjektbyggare { _ _ klass pizza { privat var deg : String = "" privat var sauce : String = "" privat var topping : String = "" def setDeg ( deg : String ) : Enhet = { detta . deg = deg _ def setSauce ( sås : String ) : Unit = { this . sås = sås _ def setTopping ( topping : String ) : Unit = { this . topping = topping } def outputReceipt () : Enhet = { println ( s"Deg: $ deg \nSås: $ sås \nTopping: $ topping " ) } } abstrakt klass AbstractPizzaBuilder { protected var pizza : Alternativ [ Pizza ] = Ingen def getPizza : Alternativ [ Pizza ] = pizza def createPizza () : Unit = { pizza = Some ( new Pizza ) } def buildDough () : Unit def buildSauce () : Unit def buildTopping () : Unit } class HawaiianPizzaBuilder utökar AbstractPizzaBuilder { åsidosätt def buildDough () : Enhet = { pizza . . setDough ( "kors" ) } åsidosätt def buildSauce () : Enhet = { pizza . . setSauce ( "mild" ) } åsidosätt def buildTopping () : Enhet = { pizza . . setTopping ( "skinka+ananas" ) } } class SpicyPizzaBuilder utökar AbstractPizzaBuilder { åsidosätt def buildDough () : Enhet = { pizza . . setDeg ( "pannbakad" ) } åsidosätt def buildSauce () : Enhet = { pizza . . setSauce ( "het" ) } åsidosätt def buildTopping () : Enhet = { pizza . . setTopping ( "pepperoni+salami" ) } } klass servitör { private var pizzaBuilder : Alternativ [ AbstractPizzaBuilder ] = Ingen def setPizzaBuilder ( pizzaBuilder : AbstractPizzaBuilder ) : Unit = { this . pizzaBuilder = Some ( pizzaBuilder ) println ( s"Builder ${ pizzaBuilder . getClass . getName } är inställd som standard" ) } def createPizza () : Pizza = { pizzaBuilder . . createPizza () pizzaBuilder . . buildDough () pizzaBuilder . . buildSauce () pizzaBuilder . . buildTopping () pizzaBuilder . . getPizza . } } objectBuilderTest { _ def main ( args : Array [ String ] ) : Enhet = { val waiter = new Waiter println ( "Output:" ) servitör . setPizzaBuilder ( ny HawaiianPizzaBuilder ) servitör . skapaPizza (). outputKvitto () servitör . setPizzaBuilder ( ny SpicyPizzaBuilder ) servitör . skapaPizza (). outputKvitto () } } } // Utdata: // Builder com.builder.package$HawaiianPizzaBuilder är inställd som standard // Deg: kors // Sås: mild // Topping: skinka+ananas // Builder com.builder.package$SpicyPizzaBuilder är inställd som standard // / Deg: pannbakad // Sås: varm // Topping: pepperoni+salami

C#

Källtext i C# använder System ; använder System.Collections.Generic ; namespace Builder { public class MainApp { public static void Main () { // Create director and builders Director director = new Director (); Builder b1 = new ConcreteBuilder1 (); Builder b2 = new ConcreteBuilder2 (); // Konstruera två produkter direktör . Konstruera ( b1 ); Produkt p1 = b1 . GetResult (); p1 . visa (); regissör . Konstruera ( b2 ); Produkt p2 = b2 . GetResult (); p2 . visa (); // Vänta på användarkonsolen . läs (); } } // "Regissör" class Director { // Builder använder en komplex serie steg public void Construct ( Builder builder ) { builder . BuildPart (); byggare . BuildPartB (); } } // "Byggare" abstrakt klass Builder { public virtual void BuildPartA (){} public virtual void BuildPartB (){} public abstract Product GetResult (); } // "ConcreteBuilder1" klass ConcreteBuilder1 : Builder { privat skrivskyddad produktprodukt = ny produkt ( ); public override void BuildPartA () { produkt . Lägg till ( "PartA" ); } public override void BuildPartB () { produkt . Lägg till ( "PartB" ); } public override Product GetResult () { return product ; } } // "ConcreteBuilder2" klass ConcreteBuilder2 : Builder { privat skrivskyddad produktprodukt = ny produkt ( ); public override void BuildPartA () { produkt . Lägg till ( "PartX" ); } public override void BuildPartB () { produkt . Lägg till ( "Party" ); } public override Product GetResult () { return product ; } } // "Produkt" klass Produkt { privat skrivskyddad lista < sträng > delar = ny lista < sträng >(); public void Lägg till ( strängdel ) { delar . Lägg till ( del ); } public void Visa () { Console . WriteLine ( "\nProduktdelar -------" ); foreach ( strängdel i delar ) Konsol . _ WriteLine ( del ); } } }

C++

Källtext i C++ // Implementering i C++. #include <iostream> #inkludera <minne> #inkludera <sträng> // Produktklass Pizza { privat : std :: strängdeg ; _ std :: strängsås ; _ std :: strängtoppning ; _ offentliga : Pizza () { } ~ Pizza () { } void SetDough ( const std :: string & d ) { deg = d ; } void SetSauce ( const std :: string & s ) { sauce = s ; } void SetTopping ( const std :: string & t ) { topping = t ; } void ShowPizza () { std :: cout << "Smaskigt!!!" << std :: endl << "Pizza med deg som" << deg << ", Sås som " << sås << "och Topping som" << topping << "!!!" << std :: endl ; } }; // Abstrakt byggmästarklass PizzaBuilder { skyddad : std :: shared_ptr < Pizza > pizza ; offentliga : PizzaBuilder () {} virtuell ~ PizzaBuilder () {} std :: shared_ptr < Pizza > GetPizza () { return pizza ; } void createNewPizzaProduct () { pizza . återställ ( ny pizza ); } virtuell void buildDough () = 0 ; virtual void buildSauce () = 0 ; virtual void buildTopping () = 0 ; }; // ConcreteBuilder -klass HawaiianPizzaBuilder : offentlig PizzaBuilder { offentliga : HawaiianPizzaBuilder () : PizzaBuilder () {} ~ HawaiianPizzaBuilder (){} void buildDough () { pizza -> SetDough ( "cross" ); } void buildSauce () { pizza -> SetSauce ( "mild" ); } void buildTopping () { pizza -> SetTopping ( "skinka och ananas" ); } }; // ConcreteBuilder -klass SpicyPizzaBuilder : offentlig PizzaBuilder { offentliga : SpicyPizzaBuilder () : PizzaBuilder () {} ~ SpicyPizzaBuilder () {} void buildDough () { pizza -> SetDough ( "pannbakad" ); } void buildSauce () { pizza -> SetSauce ( "het" ); } void buildTopping () { pizza -> SetTopping ( "pepperoni och salami" ); } }; // Direktör klass Servitör { privat : PizzaBuilder * pizzaBuilder ; offentliga : Servitör () : pizzaBuilder ( nullptr ) {} ~ Servitör () { } void SetPizzaBuilder ( PizzaBuilder * b ) { pizzaBuilder = b ; } std :: shared_ptr < Pizza > GetPizza () { return pizzaBuilder -> GetPizza (); } void ConstructPizza () { pizzaBuilder -> createNewPizzaProduct (); pizzaBuilder -> buildDough (); pizzaBuilder -> buildSauce (); pizzaBuilder -> buildTopping (); } }; // Kunden beställer två pizzor. int main () { Servitör servitör ; HawaiianPizzaBuilder hawaiianPizzaBuilder ; servitör . SetPizzaBuilder ( & hawaiianPizzaBuilder ); servitör . ConstructPizza (); std :: shared_ptr < Pizza > pizza = servitör . GetPizza (); pizza -> ShowPizza (); SpicyPizzaBuilder spicyPizzaBuilder ; servitör . SetPizzaBuilder ( & spicyPizzaBuilder ); servitör . ConstructPizza (); pizza = servitör . GetPizza (); pizza -> ShowPizza (); returnera EXIT_SUCCESS ; }

JavaScript

JavaScript-källkod // Produktfunktion Pizza ( ) { var duplicate = this ; // konstant referens till det instansierade objektet som ska anropas för någon denna var- deg ; var sås ; var topping ; detta . setDough = funktion ( val ) { deg = val ; }; detta . setSauce = function ( val ) { sauce = val ; }; detta . setTopping = funktion ( val ) { topping = val ; }; // på grund av språkets natur måste getters (även om vi inte behöver dem) // definieras i samma funktion som de lokala variablerna this . getDough = function ( ) { returdeg ; }; detta . getSauce = function () { return sauce ; }; detta . getTopping = function () { return topping ; }; // vi måste skapa en metod som ändrar egenskaperna för ett redan skapat objekt // (se createNewPizzaProduct) detta . clear = function () { duplicera . setDough ( odefinierad ); duplicera . setSauce ( odefinierad ); duplicera . setTopping ( odefinierad ); }; } // Abstrakt Builder - funktion PizzaBuilder () { var pizza = new Pizza (); detta . getPizza = function () { return pizza ; }; detta . createNewPizzaProduct = function () { // om vi bara ändrar värdet på pizzavariabeln så kommer ändringen // inte att påverka barnklasserna på något sätt, eftersom inuti dem hänvisar den variabla pizzan // till det "gamla" minnesområdet pizza . rensa (); // om vi är inne i implementeringarna (HawaiianPizzaBuilder, SpicyPizzaBuilder) // använder vi getPizza-metoden istället för pizzavariabeln, // då kan vi använda // pizza = new Pizza(); // och Pizza behöver inte den tydliga metoden }; detta . buildDough = function ( val ) { }; detta . buildSauce = function ( val ) { }; detta . buildTopping = funktion ( val ) { }; } // ConcreteBuilder - funktion HawaiianPizzaBuilder () { PizzaBuilder . ring ( detta ); var pizza = detta . getPizza (); // simulera skyddad detta . buildDough = function () { pizza . setDough ( "kors" ); }; detta . buildSauce = function () { pizza . setSauce ( "mild" ); }; detta . buildTopping = function () { pizza . setTopping ( "skinka+ananas" ); }; } function SpicyPizzaBuilder () { PizzaBuilder . ring ( detta ); var pizza = detta . getPizza (); detta . buildDough = function () { pizza . setDough ( "pannbakad" ); }; detta . buildSauce = function () { pizza . setSauce ( "het" ); }; detta . buildTopping = function () { pizza . setTopping ( "pepperoni+salami" ); }; } // Director function Waiter () { var pizzaBuilder ; detta . setPizzaBuilder = funktion ( byggare ) { pizzaBuilder = byggare ; }; detta . getPizza = function () { return pizzaBuilder . getPizza (); }; detta . constructPizza = function () { pizzaBuilder . createNewPizzaProduct (); pizzabyggare . byggdeg (); pizzabyggare . buildSauce (); pizzabyggare . buildTopping (); }; } // Kunden beställer två pizzor var pizza ; var waiter = ny servitör (); var hawaiianPizzaBuilder = new HawaiianPizzaBuilder (); servitör . setPizzaBuilder ( hawaiianPizzaBuilder ); servitör . constructPizza (); pizza = servitör . getPizza (); alert ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () ); var spicyPizzaBuilder = ny SpicyPizzaBuilder (); servitör . setPizzaBuilder ( spicyPizzaBuilder ); servitör . constructPizza (); pizza = servitör . getPizza (); alert ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );

Python

Källkod i Python #coding: utf-8 klass Djur : """ Abstrakt djur """ ben = 0 svans = Falskt vrål = '' klass Mutator : """ Ansvarig för reproduktion """ def mutate ( self ): self . djur = djur () class Cat ( Mutator ): """ Cat """ def create_legs ( self ): self . djur . ben = 4 def create_tail ( själv ): själv . djur . svans = Sant def create_roar ( själv ): själv . djur . vråla = 'meowww!' klass Hund ( Mutator ): """ Hund """ def create_legs ( själv ): själv . djur . ben = 4 def create_tail ( själv ): själv . djur . svans = Sant def create_roar ( själv ): själv . djur . vråla = 'woffff!' class AnimalOwner : """ Djurägare """ __mutator = '' def set_animal ( själv , mutator ): själv . __mutator = mutator def create_an_animal_for_me ( själv ): själv . __mutator . mutera () själv . __mutator . create_legs () själv . __mutator . create_tail () själv . __mutator . create_roar () def get_animal ( själv ): returnera själv . __mutator . djur- c = Katt () d = Hund () ao = Djurägare () ao . set_animal ( c ) ao . skapa_ett_djur_för_mig () djur = ao . get_animal () tryck djur . vråla #meowww !

PHP5

PHP källkod <?php /** * Mönsterbyggare, fungerar på kända "byggrecept" */ /** * Pizza - Basbyggnadsobjekt */ klass Pizza { privat $_pastry = "" ; privat $_sauce = "" ; privat $_garniture = "" ; public function setPastry ( $pastry ) { $this -> _pastry = $pastry ; } public function setSauce ( $sauce ) { $this -> _sauce = $sauce ; } public function setGarniture ( $garniture ) { $this -> _garniture = $garniture ; } } /** * Builder - Abstrakt byggare */ abstrakt klass BuilderPizza { skyddad $_pizza ; public function getPizza () { return $this -> _pizza ; } public function createNewPizza () { $this -> _pizza = new Pizza (); } abstrakt offentlig funktion buildPastry (); abstrakt offentlig funktion buildSauce (); abstrakt offentlig funktionsbyggnadGarniture ( ); } /** * BuilderConcret - Betongbyggare 1 */ klass BuilderPizzaHawaii utökar BuilderPizza { public function buildPastry () { $this -> _pizza -> setPastry ( "normal" ); } public function buildSauce () { $this -> _pizza -> setSauce ( "mjuk" ); } public function buildGarniture () { $this -> _pizza -> setGarniture ( "jambon+ananas" ); } } /** * BuilderConcret - Betongbyggare 2 */ klass BuilderPizzaSpicy utökar BuilderPizza { public function buildPastry () { $this -> _pizza -> setPastry ( "puff" ); } public function buildSauce () { $this -> _pizza -> setSauce ( "het" ); } public function buildGarniture () { $this -> _pizza -> setGarniture ( "pepperoni+salami" ); } } /** * Director - Kontrollklass som startar konstruktionen * PizzaBuilder - Implementering av Builder-mönstret, som visar delegeringen av pizzaskapandeprocessen till constructPizza-metoden */ 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 (); } } // Pizzainitiering $pizzaBuilder = ny PizzaBuilder (); // Initiera tillgängliga produkter $builderPizzaHawaii = new BuilderPizzaHawaii (); $builderPizzaPicante = ny BuilderPizzaSpicy (); // Förbereder och skaffar produkten $pizzaBuilder -> setBuilderPizza ( $builderPizzaHawaii ); $pizzaBuilder -> constructPizza (); $pizza = $pizzaBuilder -> getPizza ();

Ruby

Ruby källkod # # Basbyggnadsobjekt # klass Pizza attr_accessor : bakelse , :sås , :garniture slut # # Builder - klassbyggare # class BuilderPizza attr_reader :pizza def create_new_pizza @pizza = Pizza . nytt slut def get_pizza "Din beställning. bakverk: #{ @pizza . bakverk } , sås: #{ @pizza . sauce } , garniture: #{ @pizza . garniture } " end end # # BuilderConcret - Betongbyggare 1 # klass BuilderPizzaHawaii < BuilderPizza def build_pastry @pizza . bakverk = 'normalt' slut def build_sauce @pizza . sås = 'mjuk' slut def build_garniture @pizza . garniture = 'jambon+ananas ' slutslut # # BuilderConcret - Betongbyggare 2 # klass BuilderPizzaSpicy < BuilderPizza def build_pastry @pizza . bakverk = 'puff' slut def build_sauce @pizza . sås = 'het' slut def build_garniture @pizza . garniture = 'papperoni+salami ' slutslut # # Director - Managerklassen som startar bygget # class Waiter def set_builder_pizza ( bp ) @builder_pizza = bp end def get_pizza @builder_pizza . get_pizza slut def construct_pizza @builder_pizza . create_new_pizza @builder_pizza . build_pastry @builder_pizza . build_sauce @builder_pizza . build_garniture end end servitör = Servitör . ny builder_pizza_hawaii = BuilderPizzaHawaii . new builder_pizza_spicy = BuilderPizzaSpicy . ny servitör . set_builder_pizza ( builder_pizza_hawaii ) servitör . bygga_pizza sätter servitör . get_pizza

Delphi

Källtext i Delphi program BuilderPatternExample ; {$APPTYPE KONSOL} använder SysUtils ; typ // Produkt TPizza = klass ( TObject ) strikt privat FDough , FSauce , FTopping : string ; offentlig egendom Dough : sträng skriv FDough ; egenskap Sauce : sträng skriv FSauce ; egenskap Topping : sträng skriv FTopping ; procedur Visa ; slut ; // Abstract Builder TPizzaBuilder = klass ( TObject ) strikt skyddad FPizza : TPizza ; allmän egendom Pizza : TPizza läs FPizza ; konstruktör Skapa ; förstörare Destroy ; åsidosätta ; procedur CreateNewPizzaProduct ; procedur FreePizzaProduct ; procedur Byggdeg ; virtuell ; abstrakt ; procedur BuildSauce ; virtuell ; abstrakt ; procedur BuildTopping ; virtuell ; abstrakt ; slut ; // Concrete Builder A THawaiianPizzaBuilder = klass ( TPizzaBuilder ) offentlig procedur BuildDough ; åsidosätta ; procedur BuildSauce ; åsidosätta ; procedur BuildTopping ; åsidosätta ; slut ; // Concrete Builder B TSpicyPizzaBuilder = klass ( TPizzaBuilder ) offentlig procedur BuildDough ; åsidosätta ; procedur BuildSauce ; åsidosätta ; procedur BuildTopping ; åsidosätta ; slut ; // Director TWaiter = klass ( TObject ) strikt privat FPizzaBuilder : TPizzaBuilder ; offentlig egendom PizzaBuilder : TPizzaBuilder skriv FPizzaBuilder ; konstruktör Skapa ; förstörare Destroy ; åsidosätta ; procedur ConstructPizza ; procedur FreePizza ; function GetPizza : TPizza ; slut ; {TPizza} förfarande TPizza . visa ; börja WriteLn ( 'Pizza med deg som ' + FDough + ', sås som ' + FSauce + ' och Topping som ' + FTopping + '!' ) ; slut ; {TPizzaBuilder} konstruktör TPizzaBuilder . skapa ; börja FPizza := noll ; slut ; destruktor TPizzaBuilder . Förstöra ; börja FreePizzaProduct ; ärvt Destroy ; slut ; procedur TPizzaBuilder . Gratis pizzaprodukt ; börja om FPizza <> noll FreeAndNil ( FPizza ) ; slut ; procedur TPizzaBuilder . SkapaNyPizzaProdukt ; börja om FPizza <> noll FPizza . Gratis ; FPizza := TPizza . skapa ; slut ; {THawaiianPizzaBuilder} procedur THawaiianPizzaBuilder . Byggdeg ; börja om FPizza <> noll FPizza . Deg := 'kors' ; slut ; procedur THawaiianPizzaBuilder . Byggsås ; börja om FPizza <> noll FPizza . Sås := 'mild' ; slut ; procedur THawaiianPizzaBuilder . BuildTopping ; börja om FPizza <> noll FPizza . Topping := 'skinka och ananas' ; slut ; { TSpicyPizzaBuilder } procedur TSpicyPizzaBuilder . Byggdeg ; börja om FPizza <> noll FPizza . Deg := 'pannbakad' ; slut ; procedur TSpicyPizzaBuilder . Byggsås ; börja om FPizza <> noll FPizza . Sås := 'het' ; slut ; procedur TSpicyPizzaBuilder . BuildTopping ; börja om FPizza <> noll FPizza . Topping := 'pepperoni och salami' ; slut ; {TWaiter} konstruktör TWier . skapa ; börja FPizzaBuilder := noll ; slut ; destruktor TWier . Förstöra ; börja FPizzaBuilder := noll ; ärvt Destroy ; slut ; procedur TWeiter . FreePizza ; börja om FPizzaBuilder <> noll FPizzaBuilder . Gratis pizzaprodukt ; slut ; procedur TWeiter . Konstruera Pizza ; börja om FPizzaBuilder <> noll , börja sedan FPizzaBuilder . SkapaNyPizzaProdukt ; FPizzaBuilder . Byggdeg ; FPizzaBuilder . Byggsås ; FPizzaBuilder . BuildTopping ; slut ; slut ; funktion TWAiter . GetPizza : TPizza ; börja om FPizzaBuilder <> noll Resultat := FPizzaBuilder . Pizza annars Resultat := noll ; slut ; procedur ConstructAndShowPizza ( Servitör : TWaiter ; Builder : TPizzaBuilder ) ; var Pizza : TPizza ; börja Servitör . PizzaBuilder := Builder ; servitör . Konstruera Pizza ; Pizza := Servitör . GetPizza ; prova pizza . visa ; äntligen servitör . FreePizza ; slut ; slut ; var Servitör : TWaiter ; HawaiianPizzaBuilder : THawaiianPizzaBuilder ; SpicyPizzaBuilder : TSpicyPizzaBuilder ; börja HawaiianPizzaBuilder := noll ; SpicyPizzaBuilder := noll ; Servitör := noll ; prova HawaiianPizzaBuilder := THawaiianPizzaBuilder . skapa ; SpicyPizzaBuilder := TSpicyPizzaBuilder . skapa ; Servitör := TWitör . skapa ; // Kunden har beställt två pizzor ConstructAndShowPizza ( Servitör , HawaiianPizzaBuilder ) ; ConstructAndShowPizza ( Servitör , SpicyPizzaBuilder ) ; äntligen servitör . Gratis ; HawaiianPizzaBuilder . Gratis ; SpicyPizzaBuilder . Gratis ; slut ; Läsln ; slut .

VB.NET

Källtext på språket VB.NET Importer System. Collections . Generic Namespace Builder Public Class MainApp Public Shared Sub Main () ' Skapa regissör och byggare Dim director Som ny regissör () Dim b1 As Builder = New ConcreteBuilder1 () Dim b2 As Builder = New ConcreteBuilder2 () Konstruera två produkter direktör . Konstruera ( b1 ) Dim p1 Som produkt = b1 . GetResult () p1 . Visa () regissör . Konstruera ( b2 ) Dim p2 Som produkt = b2 . GetResult () p2 . Visa () " Vänta på användarkonsolen . Läs () End Sub End Class ''Director' Class Director ' Builder använder en komplex serie av steg Public Sub Construct ( ByVal Builder As Builder ) builder . BuildPartA () byggare . BuildPartB () End Sub End Class ' "Builder" MustInherit Class Builder Public MustOverride Sub BuildPartA () Public MustOverride Sub BuildPartB () Public MustOverride - funktion GetResult ( ) Som produktslutklass ' "ConcreteBuilder1" Klass ConcreteBuilder1 ärver Builder Privat skrivskyddad produkt som ny produkt () Public Overrides Sub BuildPartA () produkt . Lägg till ( "PartA" ) End Sub Public Overrides Sub BuildPartB () produkt . Lägg till ( "PartB" ) End Sub Offentlig åsidosättning Funktion GetResult ( ) Som produkt Returprodukt Slutfunktion Slutklass _ _ ' "ConcreteBuilder2" -klass ConcreteBuilder2 ärver Builder Privat skrivskyddad produkt som ny produkt () Public Overrides Sub BuildPartA () produkt . Lägg till ( "PartX" ) End Sub Public Overrides Sub BuildPartB () produkt . Lägg till ( "PartY" ) End Sub Offentlig åsidosättning Funktion GetResult ( ) Som produkt Returprodukt Slutfunktion Slutklass _ _ ' "Produkt" Klass Produkt Privata läsbara delar Som ny lista ( Of String )() Public Sub Lägg till ( ByVal part As String ) delar . Lägg till ( del ) End Sub Public Sub Show () Console . WriteLine ( vbLf & "Product Parts -------" ) För varje del As String In parts Console . WriteLine ( del ) Next End Sub End Class End Namespace

Anteckningar

Länkar