Builder (designmønster)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 23. november 2014; checks kræver 30 redigeringer .
Bygger
Bygger
Type Genererer
fordele

Giver dig mulighed for at ændre den interne repræsentation af produktet. Isolerer kode, der implementerer konstruktion og præsentation.

Giver bedre kontrol over byggeprocessen end andre generative mønstre
Relaterede skabeloner Abstrakt fabrik , Linker
Beskrevet i Design Patterns Ja

Builder - Et generativt  designmønster giver en måde at skabe et sammensat objekt på.

Formål

Adskiller konstruktionen af ​​et komplekst objekt fra dets repræsentation, så den samme konstruktionsproces kan resultere i forskellige repræsentationer.

Fordele

Ulemper

Ansøgning

Moniker- objekter i COM er Builders, der initialiseres med en streng. Desuden bruges en anden Builder til at oprette dem - MkParseDisplayNameEx, som bestemmer monikerklassen ud fra strengen, opretter monikeren og initialiserer den med den samme streng.

Et af disse objekter, URL Moniker, bruges til indlæsning af alle sider, vedhæftede filer og dokumenter i Microsoft Internet Explorer.

Eksempler

Java

Java kilde /** "Produkt" */ klasse Pizza { private String dough = "" ; privat String sauce = "" ; privat String topping = "" ; public void setDough ( String dough ) { this . dej = dej ; } public void setSauce ( String sauce ) { this . sauce = sauce ; } public void setTopping ( String topping ) { this . topping = topping ; } } /** "Abstract Builder" */ abstrakt klasse PizzaBuilder { beskyttet Pizza pizza ; public Pizza getPizza () { return pizza ; } public void createNewPizzaProduct () { pizza = new Pizza (); } offentlig abstrakt void buildDough (); offentlig abstrakt void buildSauce (); offentlig abstrakt void buildTopping (); } /** "ConcreteBuilder" */ klasse HawaiianPizzaBuilder udvider PizzaBuilder { public void buildDough () { pizza . setDough ( "kryds" ); } public void buildSauce () { pizza . sætSauce ( "mild" ); } public void buildTopping () { pizza . setTopping ( "skinke+ananas" ); } } /** "ConcreteBuilder" */ klasse SpicyPizzaBuilder udvider PizzaBuilder { public void buildDough () { pizza . sætDej ( "pandebagt" ); } public void buildSauce () { pizza . setSauce ( "hot" ); } public void buildTopping () { pizza . setTopping ( "pepperoni+salami" ); } } /** "Direktor" */ klasse Tjener { privat PizzaBuilder pizzaBuilder ; public void setPizzaBuilder ( PizzaBuilder pb ) { pizzaBuilder = pb ; } public Pizza getPizza () { return pizzaBuilder . getPizza (); } public void constructPizza () { pizzaBuilder . skabeNytPizzaProdukt (); pizzaBuilder . byggedej (); pizzaBuilder . buildSauce (); pizzaBuilder . buildTopping (); } } /** En kunde, der bestiller en pizza. */ public class BuilderExample { public static void main ( String [] args ) { Waiter waiter = new Waiter (); PizzaBuilder hawaiianPizzaBuilder = ny HawaiianPizzaBuilder (); tjener . setPizzaBuilder ( hawaiianPizzaBuilder ); tjener . constructPizza (); Pizza pizza = tjener . getPizza (); } }


Java kilde // pattern Builder public class NutritionFacts { private final int servingSize ; private sidste int servings ; private endelige int kalorier ; privat endelig int fedt ; privat finale int natrium ; privat endelig int kulhydrat ; public static class Builder { // Påkrævede parametre private final int servingSize ; private sidste int servings ; // Yderligere parametre - initialiseret med standardværdier private int calories = 0 ; privat int fedt = 0 ; privat int kulhydrat = 0 ; privat int natrium = 0 ; public Builder ( int servingSize , int servings ) { dette . servingSize = servingSize ; dette . portioner = portioner ; } public Builder calories ( int val ) { calories = val ; returnere dette ; } public Builder fedt ( int val ) { fat = val ; returnere dette ; } public Builder kulhydrat ( int val ) { kulhydrat = val ; returnere dette ; } public Builder natrium ( int val ) { natrium = val ; returnere dette ; } public NutritionFacts build () { return new NutritionFacts ( this ); } } private NutritionFacts ( Builder builder ) { servingSize = builder . serveringsstørrelse ; portioner = bygmester . portioner ; kalorier = builder . kalorier ; fedt = bygmester . fedt ; natrium = builder . natrium ; kulhydrat = builder . kulhydrat ; } } // brug NutritionFacts cocaCola = nye NutritionFacts . bygmester ( 240 , 8 ) . kalorier ( 100 ) . natrium ( 35 ) . kulhydrat ( 27 ) . bygge ();


scala

Scala kildekode package.com _ pakkeobjektbygger { _ _ klasse pizza { privat var dej : String = "" privat var sauce : String = "" privat var topping : String = "" def setDej ( dej : String ) : Enhed = { dette . dej = dej _ def setSauce ( sovs : String ) : Unit = { this . sauce = sauce _ def setTopping ( topping : String ) : Unit = { this . topping = topping } def outputReceipt () : Enhed = { println ( s"Dej: $ dej \nSauce: $ sauce \nTopping: $ topping " ) } } abstrakt klasse AbstractPizzaBuilder { beskyttet var pizza : Mulighed [ Pizza ] = Ingen def getPizza : Mulighed [ Pizza ] = pizza def createPizza () : Enhed = { pizza = Nogle ( ny pizza ) } def buildDough () : Unit def buildSauce () : Unit def buildTopping () : Unit } klasse HawaiianPizzaBuilder udvider AbstractPizzaBuilder { tilsidesætte def buildDough () : Enhed = { pizza . . setDough ( "kryds" ) } tilsidesæt def buildSauce () : Enhed = { pizza . . sætSauce ( "mild" ) } tilsidesætte def buildTopping () : Enhed = { pizza . . setTopping ( "skinke+ananas" ) } } klasse SpicyPizzaBuilder udvider AbstractPizzaBuilder { tilsidesætte def buildDough () : Enhed = { pizza . . sætdej ( "pandebagt" ) } tilsidesæt def buildSauce () : Enhed = { pizza . . sætSauce ( "hot" ) } tilsidesætte def buildTopping () : Enhed = { pizza . . setTopping ( "pepperoni+salami" ) } } klasse tjener { private var pizzaBuilder : Mulighed [ AbstractPizzaBuilder ] = Ingen def setPizzaBuilder ( pizzaBuilder : AbstractPizzaBuilder ) : Unit = { this . pizzaBuilder = Nogle ( pizzaBuilder ) println ( s"Builder ${ pizzaBuilder . getClass . getName } er indstillet som standard" ) } def createPizza () : Pizza = { pizzaBuilder . . createPizza () pizzaBuilder . . buildDough () pizzaBuilder . . buildSauce () pizzaBuilder . . buildTopping () pizzaBuilder . . få Pizza . } } objectBuilderTest { _ def main ( args : Array [ String ] ) : Enhed = { val waiter = new Waiter println ( "Output: " ) tjener . setPizzaBuilder ( ny HawaiianPizzaBuilder ) tjener . skabePizza (). outputReceipt () tjener . setPizzaBuilder ( ny SpicyPizzaBuilder ) tjener . skabePizza (). outputkvittering () } } } // Output: // Builder com.builder.package$HawaiianPizzaBuilder er indstillet som standard // Dej: kryds // Sauce: mild // Topping: skinke+ananas // Builder com.builder.package$SpicyPizzaBuilder er indstillet som standard // / Dej: pandebagt // Sauce: varm // Topping: pepperoni+salami

C#

Kildetekst i C# bruger System ; ved hjælp af System.Collections.Generic ; navneområdebygger { _ public class MainApp { public static void Main () { // Create director and builders Director director = new Director (); Builder b1 = new ConcreteBuilder1 (); Builder b2 = new ConcreteBuilder2 (); // Konstruer to produkter direktør . Konstruktion ( b1 ); Produkt p1 = b1 . GetResult (); p1 . vis (); direktør . Konstruer ( b2 ); Produkt p2 = b2 . GetResult (); p2 . vis (); // Vent på brugerkonsollen . læs (); } } // "Instruktør" class Director { // Builder bruger en kompleks række af trin public void Construct ( Builder Builder ) { builder . BuildPart (); bygmester . BuildPartB (); } } // "Bygger" abstrakt klasse Builder { public virtual void BuildPartA (){} public virtual void BuildPartB (){} public abstract Product GetResult (); } // "ConcreteBuilder1" klasse ConcreteBuilder1 : Builder { privat skrivebeskyttet produktprodukt = nyt produkt ( ); offentlig tilsidesættelse void BuildPartA () { produkt . Tilføj ( "PartA" ); } offentlig tilsidesættelse void BuildPartB () { produkt . Tilføj ( "PartB" ); } public override Product GetResult () { return product ; } } // "ConcreteBuilder2" klasse ConcreteBuilder2 : Builder { privat skrivebeskyttet produktprodukt = nyt produkt ( ); offentlig tilsidesættelse void BuildPartA () { produkt . Tilføj ( "PartX" ); } offentlig tilsidesættelse void BuildPartB () { produkt . Tilføj ( "Fest" ); } public override Product GetResult () { return product ; } } // "Produkt" class Product { private readonly List < string > parts = new List < string >(); public void Tilføj ( strengdel ) { dele . _ Tilføj ( del ); } offentlig void Vis () { Konsol . WriteLine ( "\nProduktdele -------" ); foreach ( strengdel i dele ) Konsol . _ WriteLine ( del ); } } }

C++

Kildetekst i C++ // Implementering i C++. #include <iostream> #inkluder <hukommelse> #inkluder <streng> // Produktklasse Pizza { privat : std :: snordej ; _ std :: stringsauce ; _ std :: string topping ; offentligt : Pizza () { } ~ Pizza () { } void SetDough ( const std :: string & d ) { dej = d ; } void SetSauce ( const std :: streng & s ) { sauce = s ; } void SetTopping ( const std :: string & t ) { topping = t ; } void ShowPizza () { std :: cout << "Lækkert!!!" << std :: endl << "Pizza med dej som" << dej << ", Sauce som " << sauce << "og Topping som" << topping << "!!!" << std :: endl ; } }; // Abstrakt Builder klasse PizzaBuilder { beskyttet : std :: shared_ptr < Pizza > pizza ; offentligt : PizzaBuilder () {} virtuel ~ PizzaBuilder () {} std :: shared_ptr < Pizza > GetPizza () { return pizza ; } void createNewPizzaProduct () { pizza . nulstil ( ny pizza ); } virtuel void buildDough () = 0 ; virtual void buildSauce () = 0 ; virtual void buildTopping () = 0 ; }; // ConcreteBuilder -klasse HawaiianPizzaBuilder : offentlig PizzaBuilder { offentligt : HawaiianPizzaBuilder () : PizzaBuilder () {} ~ HawaiianPizzaBuilder (){} void buildDough () { pizza -> SetDough ( "cross" ); } void buildSauce () { pizza -> SetSauce ( "mild" ); } void buildTopping () { pizza -> SetTopping ( "skinke og ananas" ); } }; // ConcreteBuilder klasse SpicyPizzaBuilder : offentlig PizzaBuilder { offentligt : SpicyPizzaBuilder () : PizzaBuilder () {} ~ SpicyPizzaBuilder () {} void buildDough () { pizza -> SetDough ( "pan bagt" ); } void buildSauce () { pizza -> SetSauce ( "hot" ); } void buildTopping () { pizza -> SetTopping ( "pepperoni og salami" ); } }; // Direktør klasse Tjener { privat : PizzaBuilder * pizzaBuilder ; offentligt : Tjener () : pizzaBuilder ( nullptr ) {} ~ Tjener () { } 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 bestiller to pizzaer. int main () { Tjener tjener ; HawaiianPizzaBuilder hawaiianPizzaBuilder ; tjener . SetPizzaBuilder ( & hawaiianPizzaBuilder ); tjener . ConstructPizza (); std :: shared_ptr < Pizza > pizza = tjener . GetPizza (); pizza -> ShowPizza (); SpicyPizzaBuilder spicyPizzaBuilder ; tjener . SetPizzaBuilder ( & spicyPizzaBuilder ); tjener . ConstructPizza (); pizza = tjener . GetPizza (); pizza -> ShowPizza (); returner EXIT_SUCCESS ; }

JavaScript

JavaScript kildekode // Produktfunktion Pizza ( ) { var duplicate = this ; // konstant reference til det instansierede objekt, der skal kaldes for denne var- dej ; var sauce ; var topping ; dette . sætDej = funktion ( val ) { dej = val ; }; dette . sætSauce = funktion ( val ) { sauce = val ; }; dette . setTopping = funktion ( val ) { topping = val ; }; // på grund af sprogets beskaffenhed skal gettere (selvom vi ikke har brug for dem) // defineres i samme funktion som de lokale variable dette . getDough = function ( ) { returdej ; }; dette . getSauce = function () { return sauce ; }; dette . getTopping = function () { return topping ; }; // vi skal lave en metode, der ændrer egenskaberne for et allerede oprettet objekt // (se createNewPizzaProduct) denne . clear = funktion () { duplicate . sætdej ( udefineret ); duplikat . sætSauce ( udefineret ); duplikat . setTopping ( udefineret ); }; } // Abstrakt Builder - funktion PizzaBuilder () { var pizza = new Pizza (); dette . getPizza = function () { return pizza ; }; dette . createNewPizzaProduct = function () { // hvis vi bare ændrer værdien af ​​pizzavariablen, så vil ændringen // ikke påvirke børneklasserne på nogen måde, fordi inde i dem henviser den variable pizza // til den "gamle" pizza i hukommelsesområdet . klar (); // hvis inde i implementeringerne (HawaiianPizzaBuilder, SpicyPizzaBuilder) // vi bruger getPizza-metoden i stedet for pizzavariablen, // så kan vi bruge // pizza = new Pizza(); // og Pizza behøver ikke den klare metode }; dette . buildDough = funktion ( val ) { }; dette . buildSauce = funktion ( val ) { }; dette . buildTopping = funktion ( val ) { }; } // ConcreteBuilder - funktion HawaiianPizzaBuilder () { PizzaBuilder . ring ( dette ); var pizza = dette . getPizza (); // simulere beskyttet dette . buildDough = function () { pizza . setDough ( "kryds" ); }; dette . buildSauce = funktion () { pizza . sætSauce ( "mild" ); }; dette . buildTopping = funktion () { pizza . setTopping ( "skinke+ananas" ); }; } funktion SpicyPizzaBuilder () { PizzaBuilder . ring ( dette ); var pizza = dette . getPizza (); dette . buildDough = function () { pizza . sætDej ( "pandebagt" ); }; dette . buildSauce = funktion () { pizza . setSauce ( "hot" ); }; dette . buildTopping = funktion () { pizza . setTopping ( "pepperoni+salami" ); }; } // Direktør funktion Tjener () { var pizzaBuilder ; dette . setPizzaBuilder = funktion ( builder ) { pizzaBuilder = builder ; }; dette . getPizza = function () { return pizzaBuilder . getPizza (); }; dette . constructPizza = function () { pizzaBuilder . skabeNytPizzaProdukt (); pizzabygger . byggedej (); pizzabygger . buildSauce (); pizzabygger . buildTopping (); }; } // Kunde bestiller to pizzaer var pizza ; var tjener = ny tjener (); var hawaiianPizzaBuilder = ny HawaiianPizzaBuilder (); tjener . setPizzaBuilder ( hawaiianPizzaBuilder ); tjener . constructPizza (); pizza = tjener . getPizza (); alarm ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () ); var spicyPizzaBuilder = ny SpicyPizzaBuilder (); tjener . setPizzaBuilder ( spicyPizzaBuilder ); tjener . constructPizza (); pizza = tjener . getPizza (); alarm ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );

Python

Kildekode i Python #coding: utf-8 class Dyr : """ Abstrakt dyr """ ben = 0 hale = Falsk brøl = '' klasse Mutator : """ Ansvarlig for reproduktion """ def mutate ( selv ): selv . dyr = dyr () klasse Kat ( Mutator ): """ Kat """ def create_legs ( selv ): selv . dyr . ben = 4 def create_tail ( selv ): selv . dyr . hale = Sandt def create_roar ( selv ): selv . dyr . brøl = 'meowww!' klasse Hund ( Mutator ): """ Hund """ def create_legs ( selv ): selv . dyr . ben = 4 def create_tail ( selv ): selv . dyr . hale = Sandt def create_roar ( selv ): selv . dyr . brøl = 'woffff!' klasse AnimalOwner : "" " Dyreejer """ __mutator = '' def set_animal ( selv , mutator ): selv . __mutator = mutator def create_an_animal_for_me ( selv ): selv . __mutator . mutere () selv . __mutator . create_legs () selv . __mutator . create_tail () selv . __mutator . create_roar () def get_animal ( selv ): returnere selv . __mutator . dyr c = Kat () d = Hund () ao = Dyreejer () ao . sæt_dyr ( c ) bl.a. _ skabe_et_dyr_til_mig ( ) dyr = bl.a. get_animal () print dyr . brøl #meowww !

PHP5

PHP kildekode <?php /** * Mønsterbygger, opererer på kendte "byggeopskrifter" */ /** * Pizza - Grundbygningsobjekt */ klasse 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 Builder */ abstrakt klasse BuilderPizza { beskyttet $_pizza ; public function getPizza () { return $this -> _pizza ; } offentlig funktion createNewPizza () { $this -> _pizza = new Pizza (); } abstrakt offentlig funktion buildPastry (); abstrakt offentlig funktion buildSauce (); abstrakt offentlig funktionsbygningGarniture ( ); } /** * BuilderConcret - Betonbygger 1 */ klasse BuilderPizzaHawaii udvider BuilderPizza { public function buildPastry () { $this -> _pizza -> setPastry ( "normal" ); } public function buildSauce () { $this -> _pizza -> setSauce ( "blød" ); } public function buildGarniture () { $this -> _pizza -> setGarniture ( "jambon+ananas" ); } } /** * BuilderConcret - Betonbygger 2 */ klasse BuilderPizzaSpicy udvider BuilderPizza { public function buildPastry () { $this -> _pizza -> setPastry ( "puff" ); } public function buildSauce () { $this -> _pizza -> setSauce ( "hot" ); } public function buildGarniture () { $this -> _pizza -> setGarniture ( "pepperoni+salami" ); } } /** * Director - Kontrolklasse, der starter konstruktionen * PizzaBuilder - Implementering af Builder-mønsteret, der viser delegeringen af ​​pizzaoprettelsesprocessen til 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 (); } } // Pizza initialisering $pizzaBuilder = ny PizzaBuilder (); // Initialiser tilgængelige produkter $builderPizzaHawaii = ny BuilderPizzaHawaii (); $builderPizzaPicante = ny BuilderPizzaSpicy (); // Forbereder og får produktet $pizzaBuilder -> setBuilderPizza ( $builderPizzaHawaii ); $pizzaBuilder -> constructPizza (); $pizza = $pizzaBuilder -> getPizza ();

Ruby

Ruby kildekode # # Grundbygningsobjekt # klasse Pizza attr_accessor : wienerbrød , :sauce , :garniture end # # Builder - klassebygger # klasse BuilderPizza attr_reader :pizza def create_new_pizza @pizza = Pizza . ny ende def get_pizza "Din ordre. wienerbrød: #{ @pizza . wienerbrød } , sauce: #{ @pizza . sauce } , garniture: #{ @pizza . garniture } " end end # # BuilderConcret - Betonbygger 1 # klasse BuilderPizzaHawaii < BuilderPizza def build_pastry @pizza . wienerbrød = 'normal' ende def build_sauce @pizza . sauce = 'blød' ende def build_garniture @pizza . garniture = 'jambon+ananas ' afslutning # # BuilderConcret - Betonbygger 2 # klasse BuilderPizzaSpicy < BuilderPizza def build_pastry @pizza . wienerbrød = 'pust' ende def build_sauce @pizza . sauce = 'varm' ende def build_garniture @pizza . garniture = 'papperoni+salami ' afslutning # # Director - Managerklassen, der starter buildet # 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 tjener = Tjener . ny builder_pizza_hawaii = BuilderPizzaHawaii . new builder_pizza_spicy = BuilderPizzaSpicy . ny tjener . set_builder_pizza ( builder_pizza_hawaii ) tjener . bygge_pizza sætter tjener . få_pizza

Delphi

Kildetekst i Delphi program BuilderPatternExample ; {$APPTYPE KONSOL} bruger SysUtils ; type // Produkt TPizza = klasse ( TObject ) streng privat FDough , FSauce , FTopping : string ; offentlig ejendom Dough : streng skriv FDough ; egenskab Sauce : streng skrive FSauce ; egenskab Topping : streng skriv FTopping ; procedure Vis ; ende ; // Abstrakt Builder TPizzaBuilder = klasse ( TObject ) strengt beskyttet FPizza : TPizza ; offentlig ejendom Pizza : TPizza læse FPizza ; konstruktør Opret ; destructor Destroy ; tilsidesætte ; procedure CreateNewPizzaProduct ; procedure FreePizzaProduct ; procedure Byggedej ; virtuel ; abstrakt ; procedure BuildSauce ; virtuel ; abstrakt ; procedure BuildTopping ; virtuel ; abstrakt ; ende ; // Concrete Builder A THawaiianPizzaBuilder = klasse ( TPizzaBuilder ) offentlig procedure BuildDough ; tilsidesætte ; procedure BuildSauce ; tilsidesætte ; procedure BuildTopping ; tilsidesætte ; ende ; // Concrete Builder B TSpicyPizzaBuilder = klasse ( TPizzaBuilder ) offentlig procedure BuildDough ; tilsidesætte ; procedure BuildSauce ; tilsidesætte ; procedure BuildTopping ; tilsidesætte ; ende ; // Director TWaiter = klasse ( TObject ) strict private FPizzaBuilder : TPizzaBuilder ; offentlig ejendom PizzaBuilder : TPizzaBuilder skrive FPizzaBuilder ; konstruktør Opret ; destructor Destroy ; tilsidesætte ; procedure ConstructPizza ; procedure FreePizza ; funktion GetPizza : TPizza ; ende ; {TPizza} procedure TPizza . vise ; start WriteLn ( 'Pizza med dej som ' + FDough + ', sauce som ' + FSauce + ' og Topping som ' + FTopping + '!' ) ; ende ; {TPizzaBuilder} konstruktør TPizzaBuilder . skabe ; begynde FPizza := nul ; ende ; destructor TPizzaBuilder . Ødelæg ; begynde FreePizzaProduct ; nedarvet Ødelæg ; ende ; procedure TPizzaBuilder . Gratis pizzaprodukt ; start hvis FPizza <> nul , så FreeAndNil ( FPizza ) ; ende ; procedure TPizzaBuilder . CreateNewPizzaProduct ; begynde hvis FPizza <> nul FPizza . Gratis ; FPizza := TPizza . skabe ; ende ; {THawaiianPizzaBuilder} procedure THawaiianPizzaBuilder . Bygdej ; begynde hvis FPizza <> nul FPizza . Dej := 'kryds' ; ende ; procedure THawaiianPizzaBuilder . BuildSauce ; begynde hvis FPizza <> nul FPizza . Sauce := 'mild' ; ende ; procedure THawaiianPizzaBuilder . BuildTopping ; begynde hvis FPizza <> nul FPizza . Topping := 'skinke og ananas' ; ende ; { TSpicyPizzaBuilder } procedure TSpicyPizzaBuilder . Bygdej ; begynde hvis FPizza <> nul FPizza . Dej := 'pandebagt' ; ende ; procedure TSpicyPizzaBuilder . BuildSauce ; begynde hvis FPizza <> nul FPizza . Sauce := 'hot' ; ende ; procedure TSpicyPizzaBuilder . BuildTopping ; begynde hvis FPizza <> nul FPizza . Topping := 'pepperoni og salami' ; ende ; {TWaiter} konstruktør TWaiter . skabe ; start FPizzaBuilder := nul ; ende ; destruktor TWaiter . Ødelæg ; start FPizzaBuilder := nul ; nedarvet Ødelæg ; ende ; procedure TWeiter . GratisPizza ; start hvis FPizzaBuilder <> nul , så FPizzaBuilder . Gratis pizzaprodukt ; ende ; procedure TWeiter . Konstruer pizza ; start hvis FPizzaBuilder <> nul , så start FPizzaBuilder . CreateNewPizzaProduct ; FPizzaBuilder . Bygdej ; FPizzaBuilder . BuildSauce ; FPizzaBuilder . BuildTopping ; ende ; ende ; funktion Twaiter . GetPizza : TPizza ; start hvis FPizzaBuilder <> nul , så Resultat := FPizzaBuilder . Pizza andet Resultat := nul ; ende ; procedure ConstructAndShowPizza ( Tjener : TWaiter ; Builder : TPizzaBuilder ) ; var Pizza : TPizza ; begynde Tjener . PizzaBuilder := Builder ; tjener . Konstruer pizza ; Pizza := Tjener . GetPizza ; prøv pizza . vise ; endelig tjener . GratisPizza ; ende ; ende ; var Tjener : TWaiter ; HawaiianPizzaBuilder : THawaiianPizzaBuilder ; SpicyPizzaBuilder : TSpicyPizzaBuilder ; start HawaiianPizzaBuilder := nul ; SpicyPizzaBuilder := nul ; Tjener := nul ; prøv HawaiianPizzaBuilder := THawaiianPizzaBuilder . skabe ; SpicyPizzaBuilder := TSpicyPizzaBuilder . skabe ; Tjener := Tjener . skabe ; // Kunden har bestilt to pizzaer ConstructAndShowPizza ( Waiter , HawaiianPizzaBuilder ) ; ConstructAndShowPizza ( Tjeneren , SpicyPizzaBuilder ) ; endelig tjener . Gratis ; HawaiianPizzaBuilder . Gratis ; SpicyPizzaBuilder . Gratis ; ende ; Læsln ; ende .

VB.NET

Kildetekst på VB.NET sprog Importer System.Collections.Generisk Namespace Builder Public Class MainApp Public Shared Sub Main () ' Opret direktør og bygherrer Dim director Som ny direktør () Dim b1 As Builder = New ConcreteBuilder1 () Dim b2 As Builder = New ConcreteBuilder2 () Konstruer to produkter direktør . Konstruer ( b1 ) Dim p1 Som produkt = b1 . GetResult () p1 . Vis () direktør . Konstruer ( b2 ) Dim p2 Som produkt = b2 . GetResult () p2 . Vis () 'Vent på brugerkonsollen . Læs () End Sub End Class '"Director" Class Director ' Builder bruger en kompleks række af trin 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 () Public MustOverride Function GetResult ( ) Som produkt slutklasse ' "ConcreteBuilder1" -klasse ConcreteBuilder1 arver Builder Privat skrivebeskyttet produkt som nyt produkt () Offentlige tilsidesættelser Sub BuildPartA () produkt . Tilføj ( "PartA" ) End Sub Offentlige tilsidesættelser Sub BuildPartB () produkt . Tilføj ( "PartB" ) End Sub Offentlige tilsidesættelser Funktion GetResult ( ) Som produkt Returprodukt Slutfunktion Slutklasse _ _ ' "ConcreteBuilder2" -klasse ConcreteBuilder2 arver Builder Private skrivebeskyttede produkt som nyt produkt () Offentlige tilsidesættelser Sub BuildPartA () produkt . Tilføj ( "PartX" ) End Sub Offentlige tilsidesættelser Sub BuildPartB () produkt . Tilføj ( "PartY" ) End Sub Offentlige tilsidesættelser Funktion GetResult ( ) Som produkt Returprodukt Slutfunktion Slutklasse _ _ ' Produktklasse Produkt Private skrivebeskyttede dele som ny liste ( af streng ) () Public Sub Add ( ByVal part As String ) dele . Tilføj ( del ) End Sub Offentlig undershow ( ) -konsol . WriteLine ( vbLf & " Produktdele ------- " ) For hver del Som String In Parts Console . WriteLine ( del ) Next End Sub End Class End Namespace

Noter

Links