Stavitel (návrhový vzor)
Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od
verze recenzované 23. listopadu 2014; kontroly vyžadují
30 úprav .
Stavitel |
---|
Stavitel |
Typ |
Generování |
profesionálové |
Umožňuje změnit vnitřní reprezentaci produktu. Izoluje kód, který implementuje konstrukci a prezentaci.
Poskytuje jemnější kontrolu nad procesem výstavby než jiné generativní vzory |
Související šablony |
Abstraktní továrna , Linker |
Popsáno v Návrhové vzory |
Ano |
Builder – generativní návrhový vzor poskytuje způsob , jak vytvořit složený objekt.
Účel
Odděluje konstrukci složitého objektu od jeho reprezentace, takže stejný proces výstavby může vést k různým reprezentacím.
Pro
- umožňuje změnit vnitřní reprezentaci produktu;
- izoluje kód, který implementuje konstrukci a prezentaci;
- poskytuje jemnější kontrolu nad procesem návrhu.
Nevýhody
- Algoritmus pro vytvoření komplexního objektu by neměl záviset na tom, z jakých částí se objekt skládá a jak do sebe zapadají;
- proces výstavby musí poskytovat různé reprezentace konstruovaného objektu.
Aplikace
Moniker objekty v COM jsou Builders, které jsou inicializovány pomocí řetězce. K jejich vytvoření se navíc používá další Builder - MkParseDisplayNameEx, který z řetězce určí zástupnou třídu, vytvoří přezdívku a inicializuje ji stejným řetězcem.
Jeden z těchto objektů, URL Moniker, se používá pro veškeré načítání stránek, příloh a dokumentů v aplikaci Microsoft Internet Explorer.
Příklady
Zdroj Java
/** "Produkt" */
class Pizza {
private String těsto = "" ;
private String sauce = "" ;
private String topping = "" ;
public void setTough ( String těsto ) { this . těsto = těsto ; }
public void setSauce ( Stringová omáčka ) { this . omáčka = omáčka ; }
public void setTopping ( String topping ) { this . topping = topping ; }
}
/** "Abstract Builder" */
abstract class PizzaBuilder {
protected Pizza pizza ;
public Pizza getPizza () { return pizza ; }
public void createNewPizzaProduct () { pizza = new Pizza (); }
veřejné abstrakt void buildTough ();
public abstract void buildSauce ();
public abstract void buildTopping ();
}
/** "ConcreteBuilder" */
class HawaiianPizzaBuilder rozšiřuje PizzaBuilder {
public void buildDough () { pizza . setTough ( "kříž" ); }
public void buildSauce () { pizza . setSauce ( "mírná" ); }
public void buildTopping () { pizza . setTopping ( "šunka+ananas" ); }
}
/** "ConcreteBuilder" */
class SpicyPizzaBuilder rozšiřuje PizzaBuilder {
public void buildDough () { pizza . setTough ( "pečený na pánvi" ); }
public void buildSauce () { pizza . setSauce ( "horká" ); }
public void buildTopping () { pizza . setTopping ( "pepperoni+salám" ); }
}
/** "Ředitel" */
class Číšník {
private PizzaBuilder pizzaBuilder ;
public void setPizzaBuilder ( PizzaBuilder pb ) { pizzaBuilder = pb ; }
public Pizza getPizza () { return pizzaBuilder . getPizza (); }
public void constructPizza () {
pizzaBuilder . createNewPizzaProduct ();
pizzaBuilder . stavětTěsto ();
pizzaBuilder . buildSauce ();
pizzaBuilder . buildTopping ();
}
}
/** Zákazník, který si objedná pizzu. */
public class BuilderExample {
public static void main ( String [] args ) {
Číšník číšník = new Číšník ();
PizzaBuilder hawaiianPizzaBuilder = nový HawaiianPizzaBuilder ();
číšník . setPizzaBuilder ( hawaiianPizzaBuilder );
číšník . konstruktPizza ();
Pizza pizza = číšník . getPizza ();
}
}
Zdroj Java
// pattern Builder
public class NutritionFacts {
private final int serveSize ;
soukromé konečné int porce ;
soukromé konečné int kalorií ;
soukromý konečný int tuk ;
private final int sodík ;
soukromý konečný int sacharid ;
public static class Builder {
// Povinné parametry
private final int serveSize ;
soukromé konečné int porce ;
// Další parametry - inicializovány s výchozími hodnotami
private int kalorií = 0 ;
private int fat = 0 ;
private int sacharid = 0 ;
private int sodík = 0 ;
public Builder ( int serveSize , int serves ) {
this . PorceVelikost = PorceVelikost ;
toto . porce = porce ;
}
public Builder kalorie ( int val ) {
calorie = val ;
vrátit toto ;
}
public Builder fat ( int val ) {
fat = val ;
vrátit toto ;
}
public Builder sacharid ( int val ) {
sacharid = val ;
vrátit toto ;
}
public Builder sodík ( int val ) {
sodík = val ;
vrátit toto ;
}
public NutritionFacts build () {
return new NutritionFacts ( this );
}
}
private NutritionFacts ( Builder builder ) {
serveSize = builder . velikost porce ;
porce = stavitel . porce ;
kalorie = stavitel . kalorie ;
tuk = stavitel . tuk ;
sodík = builder . sodík ;
sacharid = stavitel . uhlohydráty ;
}
}
// použití
NutritionFacts cocaCola = new NutritionFacts
. stavitel ( 240 , 8 )
. kalorií ( 100 )
. sodík ( 35 )
. sacharidy ( 27 )
. stavět ();
Zdrojový kód Scala
package.com _
package object builder {
třída Pizza {
private var těsto : String = ""
private var omáčka : String = ""
private var topping : String = ""
def setTough ( těsto : Řetězec ) : Unit = {
this . těsto = těsto
_
def setSauce ( omáčka : String ) : Unit = {
this . omáčka = omáčka
_
def setTopping ( topping : String ) : Unit = {
this . topping = topping
}
def outputReceipt () : Unit = {
println ( s"Těsto: $ těsto \nOmáčka: $ omáčka \nTopping: $ topping " )
}
}
abstraktní třída AbstractPizzaBuilder {
protected var pizza : Možnost [ Pizza ] = Žádná
def getPizza : Možnost [ Pizza ] = pizza
def createPizza () : Unit = {
pizza = Some ( new Pizza )
}
def buildTough () : Unit
def buildSauce () : Unit
def buildTopping () : Unit
}
class HawaiianPizzaBuilder rozšiřuje AbstractPizzaBuilder {
override def buildTough () : Unit = {
pizza . získat _ setTough ( "kříž" )
}
override def buildSauce () : Unit = {
pizza . získat _ setSauce ( "mild" )
}
override def buildTopping () : Unit = {
pizza . získat _ setTopping ( "šunka+ananas" )
}
}
class SpicyPizzaBuilder rozšiřuje AbstractPizzaBuilder {
override def buildTough () : Unit = {
pizza . získat _ setTough ( "pečený na pánvi" )
}
override def buildSauce () : Unit = {
pizza . získat _ setSauce ( "horké" )
}
override def buildTopping () : Unit = {
pizza . získat _ setTopping ( "pepperoni+salám" )
}
}
třída číšník {
private var pizzaBuilder : Možnost [ AbstractPizzaBuilder ] = Žádná
def setPizzaBuilder ( pizzaBuilder : AbstractPizzaBuilder ) : Unit = {
this . pizzaBuilder = Some ( pizzaBuilder )
println ( s"Builder ${ pizzaBuilder . getClass . getName } je nastaven jako výchozí" )
}
def createPizza () : Pizza = {
pizzaBuilder . získat _ createPizza ()
pizzaBuilder . získat _ buildDough ()
pizzaBuilder . získat _ buildSauce ()
pizzaBuilder . získat _ buildTopping ()
pizzaBuilder . získat _ getPizza . získat
}
}
objectBuilderTest { _
def main ( args : Pole [ Řetězec ]) : Jednotka = {
val číšník = nový číšník
println ( "Výstup:" )
číšník . setPizzaBuilder ( nový HawaiianPizzaBuilder )
číšník . vytvořitPizza (). výstupPříjem ()
číšník . setPizzaBuilder ( nový SpicyPizzaBuilder )
číšník . vytvořitPizza (). outputReceipt ()
}
}
}
// Výstup:
// Builder com.builder.package$HawaiianPizzaBuilder je nastaven jako výchozí
// Těsto: křížové
// Omáčka: jemná
// Poleva: šunka+ananas
// Builder com.builder.package$SpicyPizzaBuilder je nastaven jako výchozí
/ / Těsto: pečené na pánvi
// Omáčka: pálivá
// Poleva: feferonky+salám
Zdrojový text v C#
pomocí System ;
pomocí System.Collections.Generic ;
tvůrce
jmenného prostoru {
public class MainApp
{
public static void Main ()
{
// Vytvořit ředitele a stavitele
Director director = new Director ();
Builder b1 = new ConcreteBuilder1 ();
Builder b2 = new ConcreteBuilder2 ();
// Vytvořte dva produkty
director . konstrukt ( bl );
Produkt p1 = b1 . GetResult ();
p1 . ukázat ();
ředitel . konstrukt ( b2 );
Produkt p2 = b2 . GetResult ();
p2 . ukázat ();
// Počkejte na uživatelskou
konzoli . číst ();
}
}
// "Ředitel"
class Director
{
// Builder používá komplexní sérii kroků
public void Construct ( Builder builder )
{
builder . BuildPart ();
stavitel . BuildPartB ();
}
}
// "Tvůrce"
abstract class Builder
{
public virtual void BuildPartA (){}
public virtual void BuildPartB (){}
public abstract Product GetResult ();
}
// "ConcreteBuilder1"
class ConcreteBuilder1 : Builder
{
private readonly Product product = new Product ();
public override void BuildPartA ()
{
produkt . Přidat ( "Část A" );
}
public override void BuildPartB ()
{
produkt . Přidat ( "Část B" );
}
public override Product GetResult ()
{
return product ;
}
}
// "ConcreteBuilder2"
class ConcreteBuilder2 : Builder
{
private readonly Product product = new Product ();
public override void BuildPartA ()
{
produkt . Přidat ( "PartX" );
}
public override void BuildPartB ()
{
produkt . Přidat ( "Party" );
}
public override Product GetResult ()
{
return product ;
}
}
// "Produkt"
class Produkt
{
private readonly List < string > parts = new List < string >();
public void Add ( string part )
{
parts . Přidat ( část );
}
public void Zobrazit ()
{
Console . WriteLine ( "\nČásti produktu -------" );
foreach ( část strun po částech ) Konzole . WriteLine ( část ); } } }
Zdrojový text v C++
// Implementace v C++.
#include <iostream>
#include <paměť>
#include <řetězec>
//
Třída produktu Pizza
{
soukromý :
std :: provázkové těsto ;
std :: stringsauce ; _
std :: topping string ;
veřejnost :
Pizza () { }
~ Pizza () { }
void SetTough ( const std :: string & d ) { těsto = d ; }
void SetSauce ( const std :: string & s ) { omáčka = s ; }
void SetTopping ( const std :: string & t ) { topping = t ; }
void ShowPizza ()
{
std :: cout << "Mňam!!!" << std :: endl
<< "Pizza s těstem jako" << těsto
<< ", Omáčka jako " << omáčka
<< "a Topping as" << topping
<< "!!!" << std :: endl ;
}
};
// Abstraktní
třída Builder PizzaBuilder
{
chráněno :
std :: shared_ptr < Pizza > pizza ;
veřejnost :
PizzaBuilder () {}
virtuální ~ PizzaBuilder () {}
std :: shared_ptr < Pizza > GetPizza () { return pizza ; }
void createNewPizzaProduct () { pizza . reset ( nová Pizza ); }
virtuální void buildTough () = 0 ;
virtuální void buildSauce () = 0 ;
virtuální void buildTopping () = 0 ;
};
//
Třída ConcreteBuilder HawaiianPizzaBuilder : veřejný PizzaBuilder
{
veřejnost :
HawaiianPizzaBuilder () : PizzaBuilder () {}
~ HawaiianPizzaBuilder (){}
void buildTough () { pizza -> SetTough ( "cross" ); }
void buildSauce () { pizza -> SetSauce ( "mild" ); }
void buildTopping () { pizza -> SetTopping ( "šunka a ananas" ); }
};
//
Třída ConcreteBuilder SpicyPizzaBuilder : veřejný PizzaBuilder
{
veřejnost :
SpicyPizzaBuilder () : PizzaBuilder () {}
~ SpicyPizzaBuilder () {}
void buildTough () { pizza -> SetTough ( "pečeno na pánvi" ); }
void buildSauce () { pizza -> SetSauce ( "horká" ); }
void buildTopping () { pizza -> SetTopping ( "pepperoni a salám" ); }
};
//
Třída ředitele číšník
{
soukromý :
PizzaBuilder * pizzaBuilder ;
veřejnost :
Číšník () : pizzaBuilder ( nullptr ) {}
~ Číšník () { }
void SetPizzaBuilder ( PizzaBuilder * b ) { pizzaBuilder = b ; }
std :: shared_ptr < Pizza > GetPizza () { return pizzaBuilder -> GetPizza (); }
void ConstructPizza ()
{
pizzaBuilder -> createNewPizzaProduct ();
pizzaBuilder -> buildTough ();
pizzaBuilder -> buildSauce ();
pizzaBuilder -> buildTopping ();
}
};
// Klient si objedná dvě pizzy.
int main ()
{
číšník číšník ;
HawaiianPizzaBuilder hawaiianPizzaBuilder ;
číšník . SetPizzaBuilder ( & hawaiianPizzaBuilder );
číšník . ConstructPizza ();
std :: shared_ptr < Pizza > pizza = číšník . GetPizza ();
pizza -> ShowPizza ();
SpicyPizzaBuilder spicyPizzaBuilder ;
číšník . SetPizzaBuilder ( & spicyPizzaBuilder );
číšník . ConstructPizza ();
pizza = číšník . GetPizza ();
pizza -> ShowPizza ();
return EXIT_SUCCESS ;
}
Zdrojový kód JavaScriptu
//
Funkce produktu Pizza () {
var duplicate = this ; // konstantní odkaz na vytvořený objekt, který má být volán pro jakýkoli tento
var těsto ;
var omáčka ;
var poleva ;
toto . setTough = funkce ( val ) {
těsto = val ;
};
toto . setSauce = function ( val ) {
sauce = val ;
};
toto . setTopping = function ( val ) {
topping = val ;
};
// vzhledem k povaze jazyka musí být getry (i když je nepotřebujeme)
// definovány ve stejné funkci jako lokální proměnné
this . getTough = function () {
return těsto ;
};
toto . getSauce = function () {
return sauce ;
};
toto . getTopping = function () {
return topping ;
};
// musíme vytvořit metodu, která změní vlastnosti již vytvořeného objektu
// (viz createNewPizzaProduct)
this . clear = function () {
duplicate . setTough ( nedefinováno );
duplikát . setSauce ( undefined );
duplikát . setTopping ( nedefinováno );
};
}
// Abstract Builder
function PizzaBuilder () {
var pizza = new Pizza ();
toto . getPizza = function () {
return pizza ;
};
toto . createNewPizzaProduct = function () {
// pokud jen změníme hodnotu proměnné pizza, pak změna
// nijak neovlivní podřízené třídy, protože uvnitř nich proměnná pizza
// odkazuje na "starou" paměťovou oblast
pizza . jasné ();
// pokud uvnitř implementací (HawaiianPizzaBuilder, SpicyPizzaBuilder)
// místo proměnné pizza použijeme metodu getPizza,
// pak můžeme použít
// pizza = new Pizza();
// a Pizza nebude potřebovat metodu clear
};
toto . buildTough = function ( val ) { };
toto . buildSauce = function ( val ) { };
toto . buildTopping = function ( val ) { };
}
//
Funkce ConcreteBuilder HawaiianPizzaBuilder () {
PizzaBuilder . zavolat ( toto );
var pizza = toto . getPizza (); // simulovat chráněno
toto . buildTough = function () { pizza . setTough ( "kříž" ); };
toto . buildSauce = function () { pizza . setSauce ( "mírná" ); };
toto . buildTopping = function () { pizza . setTopping ( "šunka+ananas" ); };
}
function SpicyPizzaBuilder () {
PizzaBuilder . zavolat ( toto );
var pizza = toto . getPizza ();
toto . buildTough = function () { pizza . setTough ( "pečený na pánvi" ); };
toto . buildSauce = function () { pizza . setSauce ( "horká" ); };
toto . buildTopping = function () { pizza . setTopping ( "pepperoni+salám" ); };
}
//
Funkce ředitele Číšník () {
var pizzaBuilder ;
toto . setPizzaBuilder = function ( builder ) {
pizzaBuilder = builder ;
};
toto . getPizza = function () {
return pizzaBuilder . getPizza ();
};
toto . constructPizza = function () {
pizzaBuilder . createNewPizzaProduct ();
pizzaBuilder . stavětTěsto ();
pizzaBuilder . buildSauce ();
pizzaBuilder . buildTopping ();
};
}
// Zákazník si objedná dvě pizzy
var pizza ;
var číšník = nový číšník ();
var hawaiianPizzaBuilder = new HawaiianPizzaBuilder ();
číšník . setPizzaBuilder ( hawaiianPizzaBuilder );
číšník . konstruktPizza ();
pizza = číšník . getPizza ();
upozornění ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );
var spicyPizzaBuilder = new SpicyPizzaBuilder ();
číšník . setPizzaBuilder ( spicyPizzaBuilder );
číšník . konstruktPizza ();
pizza = číšník . getPizza ();
upozornění ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );
Zdrojový kód v Pythonu
#coding: utf-8
class Zvíře :
"""
Abstraktní zvíře
"""
nohy = 0
ocas = Falešný
řev = ''
class Mutator :
"""
Zodpovědný za reprodukci
"""
def mutate ( self ):
self . zvíře = zvíře ()
class Cat ( Mutator ):
"""
Cat
"""
def create_legs ( self ):
self . zvíře . nohy = 4
def create_tail ( self ):
self . zvíře . ocas = pravda
def create_roar ( self ):
self . zvíře . řev = 'meowww!'
třída Pes ( Mutator ):
"""
Pes
"""
def create_legs ( self ):
self . zvíře . nohy = 4
def create_tail ( self ):
self . zvíře . ocas = pravda
def create_roar ( self ):
self . zvíře . řev = 'woffff!'
class AnimalOwner :
"""
Majitel zvířat
"""
__mutator = ''
def set_animal ( self , mutator ):
self . __mutátor = mutátor
def create_an_animal_for_me ( self ):
self . __mutátor . mutovat ()
sebe . __mutátor . create_legs ()
self . __mutátor . create_tail ()
self . __mutátor . create_roar ()
def get_animal ( self ):
return self . __mutátor . zvíře
c = Kočka ()
d = Pes ()
ao = Majitel zvířat ()
ao . set_animal ( c )
ao . create_an_animal_for_me ()
zvíře = ao . get_animal ()
tisknout zvíře . řev #meowww !
Zdrojový kód PHP
<?php
/**
* Tvůrce vzorů, pracuje se známými "stavebními recepturami"
*/
/**
* Pizza - Základní stavební objekt
*/
class Pizza {
soukromé $_pečivo = "" ;
private $_sauce = "" ;
private $_garniture = "" ;
public function setPastry ( $pečivo ) {
$toto -> _pečivo = $pečivo ;
}
public function setSauce ( $sauce ) {
$this -> _sauce = $sauce ;
}
public function setGarniture ( $garniture ) {
$this -> _garniture = $garniture ;
}
}
/**
* Builder - Abstraktní stavitel
*/
abstract class BuilderPizza {
chráněná $_pizza ;
public function getPizza () {
return $this -> _pizza ;
}
public function createNewPizza () {
$this -> _pizza = new Pizza ();
}
abstraktní veřejná funkce buildPastry ();
abstraktní veřejná funkce buildSauce ();
abstraktní veřejné funkce buildGarniture ();
}
/**
* BuilderConcret - Tvůrce betonu 1
*/
class BuilderPizzaHawaii rozšiřuje BuilderPizza {
public function buildPastry () {
$this -> _pizza -> setPastry ( "normal" );
}
public function buildSauce () {
$this -> _pizza -> setSauce ( "měkká" );
}
public function buildGarniture () {
$this -> _pizza -> setGarniture ( "jambon+ananas" );
}
}
/**
* BuilderConcret - Concrete Builder 2
*/
class BuilderPizzaSpicy extends BuilderPizza {
public function buildPastry () {
$this -> _pizza -> setPastry ( "puff" );
}
public function buildSauce () {
$this -> _pizza -> setSauce ( "horká" );
}
public function buildGarniture () {
$this -> _pizza -> setGarniture ( "pepperoni+salám" );
}
}
/**
* Director - Třída Control, která spouští konstrukci
* PizzaBuilder - Implementace vzoru Builder, ukazující delegování procesu vytváření pizzy na metodu constructPizza
*/
class PizzaBuilder {
private $_builderPizza ;
public function setBuilderPizza ( BuilderPizza $mp )
{
$this -> _builderPizza = $mp ;
}
public function getPizza ()
{
return $this -> _builderPizza -> getPizza ();
}
public function constructPizza () {
$this -> _builderPizza -> createNewPizza ();
$this -> _builderPizza -> buildPastry ();
$this -> _builderPizza -> buildSauce ();
$this -> _builderPizza -> buildGarniture ();
}
}
// Inicializace pizzy
$pizzaBuilder = new PizzaBuilder ();
// Inicializace dostupných produktů
$builderPizzaHawaii = new BuilderPizzaHawaii ();
$builderPizzaPicante = new BuilderPizzaSpicy ();
// Příprava a získání produktu
$pizzaBuilder -> setBuilderPizza ( $builderPizzaHawaii );
$pizzaBuilder -> constructPizza ();
$pizza = $pizzaBuilder -> getPizza ();
Zdrojový kód Ruby
#
# Základní stavební objekt
#
class Pizza
attr_accessor :pečivo , :omáčka , :garniture
end
#
# Builder - class builder
#
class BuilderPizza
attr_reader :pizza
def create_new_pizza
@pizza = Pizza . nový
konec
def get_pizza
"Vaše objednávka. pečivo: #{ @pizza . pečivo } , omáčka: #{ @pizza . omáčka } , garnitura: #{ @pizza . garniture } "
konec
konec
#
# BuilderConcret - Concrete builder 1
#
class BuilderPizzaHawaii < BuilderPizza
def build_pastry
@pizza . pečivo = 'normální'
konec
def build_sauce
@pizza . omáčka = ‚měkký‘
konec
def build_garniture
@pizza . garniture = konec 'jambon+ananas
'
#
# BuilderConcret - Concrete builder 2
#
class BuilderPizzaSpicy < BuilderPizza
def build_pastry
@pizza . pečivo = 'listový'
konec
def build_sauce
@pizza . omáčka = 'horký'
konec
def build_garniture
@pizza . garnitura = 'papperoni+salám'
konec
konec
#
# Director - Třída manažera, která spouští sestavení
#
class Číšník
def set_builder_pizza ( bp )
@builder_pizza = bp
end
def get_pizza
@builder_pizza . get_pizza
end
def construct_pizza
@builder_pizza . create_new_pizza
@builder_pizza . build_pastry
@builder_pizza . build_sauce
@builder_pizza . build_garniture
end
end
číšník = číšník . Nový
builder_pizza_hawaii = BuilderPizzaHawaii . new
builder_pizza_spicy = BuilderPizzaSpicy . Nový
číšník . set_builder_pizza ( builder_pizza_hawaii )
číšník . konstrukt_pizza
klade číšníka . get_pizza
Zdrojový text v Delphi
program BuilderPatternExample ;
{$APPTYPE KONZOLE}
používá
SysUtils ;
typ
// Produkt
TPizza = class ( TObject )
strict private
FDough , FSauce , FTopping : string ;
veřejný
majetek Těsto : řetězec napsat FTěsto ;
vlastnost Sauce : string write FSauce ;
vlastnost Topping : string write FTopping ;
postup Zobrazit ;
konec ;
// Abstract Builder
TPizzaBuilder = class ( TObject )
strict protected
FPizza : TPizza ;
veřejný
majetek Pizza : TPizza číst FPizza ;
konstruktor Vytvořit ;
destruktor Zničit ; přepsat ;
procedura CreateNewPizzaProduct ;
postup FreePizzaProdukt ;
postup BuildTough ; virtuální ; abstraktní ;
postup BuildSauce ; virtuální ; abstraktní ;
postup BuildTopping ; virtuální ; abstraktní ;
konec ;
// Concrete Builder A
THawaiianPizzaBuilder = class ( TPizzaBuilder )
public
procedure BuildDough ; přepsat ;
postup BuildSauce ; přepsat ;
postup BuildTopping ; přepsat ;
konec ;
// Concrete Builder B
TSpicyPizzaBuilder = class ( TPizzaBuilder )
public
procedure BuildDough ; přepsat ;
postup BuildSauce ; přepsat ;
postup BuildTopping ; přepsat ;
konec ;
// Director
TWaiter = class ( TObject )
strict private
FPizzaBuilder : TPizzaBuilder ;
veřejný
majetek PizzaBuilder : TPizzaBuilder zápis FPizzaBuilder ;
konstruktor Vytvořit ;
destruktor Zničit ; přepsat ;
postup ConstructPizza ;
postup FreePizza ;
funkce GetPizza : TPizza ;
konec ;
{TPizza}
postup TPizza . ukázat ;
begin
WriteLn ( 'Pizza s těstem jako ' + FTěsto + ', omáčka jako ' + FSauce + ' a Poleva jako ' + FTopping + '!' ) ;
konec ;
{TPizzaBuilder}
konstruktor TPizzaBuilder . vytvořit ;
begin
FPizza := nula ;
konec ;
destruktor TPizzaBuilder . zničit ;
začít
FreePizzaProduct ;
zděděný Destroy ;
konec ;
postup TPizzaBuilder . Pizza produkt zdarma ;
begin
if FPizza <> nil then
FreeAndNil ( FPizza ) ;
konec ;
postup TPizzaBuilder . CreateNewPizzaProduct ;
begin
if FPizza <> nil then
FPizza . zdarma ;
FPizza := TPizza . vytvořit ;
konec ;
{THawaiianPizzaBuilder}
postup THawaiianPizzaBuilder . BuildTough ;
begin
if FPizza <> nil then
FPizza . Těsto := 'kříž' ;
konec ;
postup THawaiianPizzaBuilder . BuildSauce ;
begin
if FPizza <> nil then
FPizza . Omáčka := 'jemná' ;
konec ;
postup THawaiianPizzaBuilder . BuildTopping ;
begin
if FPizza <> nil then
FPizza . Poleva := 'šunka a ananas' ;
konec ;
{ TSpicyPizzaBuilder }
postup TSpicyPizzaBuilder . BuildTough ;
begin
if FPizza <> nil then
FPizza . Těsto := 'pečený na pánvi' ;
konec ;
postup TSpicyPizzaBuilder . BuildSauce ;
begin
if FPizza <> nil then
FPizza . Omáčka := 'horká' ;
konec ;
postup TSpicyPizzaBuilder . BuildTopping ;
begin
if FPizza <> nil then
FPizza . Poleva := 'pepperoni a salám' ;
konec ;
{TWaiter}
konstruktér TWaiter . vytvořit ;
begin
FPizzaBuilder := nil ;
konec ;
destruktor TWaiter . zničit ;
begin
FPizzaBuilder := nil ;
zděděný Destroy ;
konec ;
postup Číšník . FreePizza ;
begin
if FPizzaBuilder <> nula then
FPizzaBuilder . Pizza produkt zdarma ;
konec ;
postup Číšník . Construct Pizza ;
begin
if FPizzaBuilder <> nil then
begin
FPizzaBuilder . CreateNewPizzaProduct ;
FPizzaBuilder . BuildTough ;
FPizzaBuilder . BuildSauce ;
FPizzaBuilder . BuildTopping ;
konec ;
konec ;
funkce Číšník . GetPizza : TPizza ;
begin
if FPizzaBuilder <> nil then
Result := FPizzaBuilder . Pizza
else
Vysledek := nula ;
konec ;
procedure ConstructAndShowPizza ( Číšník : TWaiter ; Builder : TPizzaBuilder ) ;
var
Pizza : TPizza ;
začít
číšník . PizzaBuilder := Stavitel ;
číšník . Construct Pizza ;
Pizza := Číšník . GetPizza ;
zkuste
pizzu . ukázat ;
konečně
číšník . FreePizza ;
konec ;
konec ;
var
Číšník : TWaiter ;
HawaiianPizzaBuilder : THawaiianPizzaBuilder ;
SpicyPizzaBuilder : TSpicyPizzaBuilder ;
begin
HawaiianPizzaBuilder := nil ;
SpicyPizzaBuilder := nil ;
Číšník := nula ;
zkuste
HawaiianPizzaBuilder := THawaiianPizzaBuilder . vytvořit ;
SpicyPizzaBuilder := TSpicyPizzaBuilder . vytvořit ;
Číšník := Číšník . vytvořit ;
// Klient si objednal dvě pizzy
ConstructAndShowPizza ( Witer , HawaiianPizzaBuilder ) ;
ConstructAndShowPizza ( Číšník , SpicyPizzaBuilder ) ;
konečně
číšník . zdarma ;
HawaiianPizzaBuilder . zdarma ;
SpicyPizzaBuilder . zdarma ;
konec ;
Readln ;
konec .
Zdrojový text v jazyce VB.NET
Importy System.Collections.Generic
Tvůrce jmenného prostoru
Public Class MainApp
Public Shared Sub Main ()
' Vytvořit ředitele a stavitele
Ztlumit ředitele Jako nového ředitele ()
Dim b1 jako stavitel = nový ConcreteBuilder1 ()
Dim b2 jako stavitel = Nový ConcreteBuilder2 ()
' Construct dva produkty
ředitel . Konstrukce ( b1 )
Dim p1 As Product = b1 . GetResult ()
p1 . Zobrazit ()
ředitel . Konstrukce ( b2 )
Dim p2 As Product = b2 . GetResult ()
p2 . Zobrazit ()
' Počkejte na uživatelskou
konzoli . Číst ()
End Sub
End Class
' "Director"
Class Director
' Builder používá složitou sérii kroků
Public Sub Construct ( ByVal builder As Builder )
builder . BuildPartA ()
builder . BuildPartB ()
End Sub
End Class
' "Builder"
MustInherit Class Builder
Public MustOverride Sub BuildPartA ()
Public MustOverride Sub BuildPartB ()
Veřejná funkce MustOverride GetResult ( ) As Product End Class
' Třída "ConcreteBuilder1" ConcreteBuilder1 zdědí
soukromý produkt pouze pro čtení jako nový produkt ()
Public Overrides Sub BuildPartA ()
produkt . Přidat ( "PartA" )
End Sub
Public Overrides Sub BuildPartB ()
produkt . Přidat ( "Část B" )
End Sub
Veřejné přepíše funkci GetResult () Jako Product
Return Product
End Function
End Class
' Třída "ConcreteBuilder2" ConcreteBuilder2 zdědí
soukromý produkt pouze pro čtení jako nový produkt ()
Public Overrides Sub BuildPartA ()
produkt . Přidat ( "PartX" )
End Sub
Public Overrides Sub BuildPartB ()
produkt . Přidat ( "PartY" )
End Sub
Veřejné přepíše funkci GetResult () Jako Product
Return Product
End Function
End Class
' Třída "Produkt" Soukromé
části pouze pro čtení jako nový seznam ( řetězce )()
Public Sub Add ( část ByVal As String ) části . Přidat ( část ) End Sub
Veřejná dílčí show ()
Konzole . WriteLine ( vbLf & "Díly produktu -------" )
Pro každou část jako řetězec v konzole dílů
. WriteLine ( část ) Next End Sub End Class End Namespace
Poznámky
Odkazy