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
- låter dig ändra den interna representationen av produkten;
- isolerar koden som implementerar konstruktion och presentation;
- ger bättre kontroll över designprocessen.
Nackdelar
- Algoritmen för att skapa ett komplext objekt bör inte bero på vilka delar objektet består av och hur de passar ihop;
- byggprocessen måste ge olika representationer av objektet som konstrueras.
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-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 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 . få . setDough ( "kors" )
}
åsidosätt def buildSauce () : Enhet = {
pizza . få . setSauce ( "mild" )
}
åsidosätt def buildTopping () : Enhet = {
pizza . få . setTopping ( "skinka+ananas" )
}
}
class SpicyPizzaBuilder utökar AbstractPizzaBuilder {
åsidosätt def buildDough () : Enhet = {
pizza . få . setDeg ( "pannbakad" )
}
åsidosätt def buildSauce () : Enhet = {
pizza . få . setSauce ( "het" )
}
åsidosätt def buildTopping () : Enhet = {
pizza . få . 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 . få . createPizza ()
pizzaBuilder . få . buildDough ()
pizzaBuilder . få . buildSauce ()
pizzaBuilder . få . buildTopping ()
pizzaBuilder . få . getPizza . få
}
}
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
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 ); } } }
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-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 () );
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 !
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 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
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 då
FreeAndNil ( FPizza ) ;
slut ;
procedur TPizzaBuilder . SkapaNyPizzaProdukt ;
börja
om FPizza <> noll då
FPizza . Gratis ;
FPizza := TPizza . skapa ;
slut ;
{THawaiianPizzaBuilder}
procedur THawaiianPizzaBuilder . Byggdeg ;
börja
om FPizza <> noll då
FPizza . Deg := 'kors' ;
slut ;
procedur THawaiianPizzaBuilder . Byggsås ;
börja
om FPizza <> noll då
FPizza . Sås := 'mild' ;
slut ;
procedur THawaiianPizzaBuilder . BuildTopping ;
börja
om FPizza <> noll då
FPizza . Topping := 'skinka och ananas' ;
slut ;
{ TSpicyPizzaBuilder }
procedur TSpicyPizzaBuilder . Byggdeg ;
börja
om FPizza <> noll då
FPizza . Deg := 'pannbakad' ;
slut ;
procedur TSpicyPizzaBuilder . Byggsås ;
börja
om FPizza <> noll då
FPizza . Sås := 'het' ;
slut ;
procedur TSpicyPizzaBuilder . BuildTopping ;
börja
om FPizza <> noll då
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 då
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 då
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 .
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