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
- giver dig mulighed for at ændre den interne repræsentation af produktet;
- isolerer koden, der implementerer konstruktion og præsentation;
- giver bedre kontrol over designprocessen.
Ulemper
- Algoritmen til at skabe et komplekst objekt bør ikke afhænge af, hvilke dele objektet består af, og hvordan de passer sammen;
- byggeprocessen skal give forskellige repræsentationer af det objekt, der konstrueres.
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 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 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 . få . setDough ( "kryds" )
}
tilsidesæt def buildSauce () : Enhed = {
pizza . få . sætSauce ( "mild" )
}
tilsidesætte def buildTopping () : Enhed = {
pizza . få . setTopping ( "skinke+ananas" )
}
}
klasse SpicyPizzaBuilder udvider AbstractPizzaBuilder {
tilsidesætte def buildDough () : Enhed = {
pizza . få . sætdej ( "pandebagt" )
}
tilsidesæt def buildSauce () : Enhed = {
pizza . få . sætSauce ( "hot" )
}
tilsidesætte def buildTopping () : Enhed = {
pizza . få . 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 . få . createPizza ()
pizzaBuilder . få . buildDough ()
pizzaBuilder . få . buildSauce ()
pizzaBuilder . få . buildTopping ()
pizzaBuilder . få . få Pizza . få
}
}
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
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 ); } } }
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 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 () );
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 !
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 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
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 så
FPizza . Gratis ;
FPizza := TPizza . skabe ;
ende ;
{THawaiianPizzaBuilder}
procedure THawaiianPizzaBuilder . Bygdej ;
begynde
hvis FPizza <> nul så
FPizza . Dej := 'kryds' ;
ende ;
procedure THawaiianPizzaBuilder . BuildSauce ;
begynde
hvis FPizza <> nul så
FPizza . Sauce := 'mild' ;
ende ;
procedure THawaiianPizzaBuilder . BuildTopping ;
begynde
hvis FPizza <> nul så
FPizza . Topping := 'skinke og ananas' ;
ende ;
{ TSpicyPizzaBuilder }
procedure TSpicyPizzaBuilder . Bygdej ;
begynde
hvis FPizza <> nul så
FPizza . Dej := 'pandebagt' ;
ende ;
procedure TSpicyPizzaBuilder . BuildSauce ;
begynde
hvis FPizza <> nul så
FPizza . Sauce := 'hot' ;
ende ;
procedure TSpicyPizzaBuilder . BuildTopping ;
begynde
hvis FPizza <> nul så
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 .
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