Építő (tervezési minta)
Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2014. november 23-án felülvizsgált
verziótól ; az ellenőrzések 30 szerkesztést igényelnek .
Építész |
---|
Építész |
Típusú |
Generálás |
profik |
Lehetővé teszi a termék belső megjelenítésének módosítását. Elszigeteli a felépítést és megjelenítést megvalósító kódot.
Finomabban irányítja az építési folyamatot, mint más generatív minták |
Kapcsolódó sablonok |
Absztrakt gyár , Linker |
Leírása: Tervezési minták |
Igen |
Builder – A generatív tervezési minta módot biztosít összetett objektumok létrehozására.
Cél
Elválasztja egy összetett objektum felépítését a reprezentációjától, így ugyanaz az építési folyamat különböző ábrázolásokat eredményezhet.
Előnyök
- lehetővé teszi a termék belső megjelenítésének megváltoztatását;
- elkülöníti a felépítést és megjelenítést megvalósító kódot;
- pontosabban irányítja a tervezési folyamatot.
Hátrányok
- az összetett objektum létrehozásának algoritmusa nem függhet attól, hogy az objektum milyen részekből áll, és hogyan illeszkednek egymáshoz;
- az építési folyamatnak az építés alatt álló objektum különböző ábrázolását kell biztosítania.
Alkalmazás
A COM -ban található Moniker objektumok olyan Builderek, amelyek karakterlánccal inicializálódnak. Sőt, létrehozásukhoz egy másik Builder-t használnak - az MkParseDisplayNameEx-et, amely meghatározza a moniker osztályt a karakterláncból, létrehozza a monikert, és ugyanazzal a karakterlánccal inicializálja.
Ezen objektumok egyike, az URL Moniker, minden oldal, melléklet és dokumentum betöltésére használatos a Microsoft Internet Explorer programban.
Példák
Java forrás
/** "Termék" */
class Pizza {
private String tészta = "" ;
private String souse = "" ;
private String topping = "" ;
public void setDough ( String tészta ) { this . tészta = tészta ; }
public void setSauce ( String souse ) { this . szósz = szósz ; }
public void setTopping ( String topping ) { this . feltét = feltét ; }
}
/** "Abstract Builder" */
abstract class PizzaBuilder {
protected Pizza pizza ;
public Pizza getPizza () { return pizza ; }
public void createNewPizzaProduct () { pizza = new Pizza (); }
public abstract void buildDough ();
public abstract void buildSauce ();
public abstract void buildTopping ();
}
/** "ConcreteBuilder" */
class HawaiianPizzaBuilder kiterjeszti PizzaBuilder {
public void buildDough () { pizza . setDough ( "kereszt" ); }
public void buildSauce () { pizza . setSauce ( "enyhe" ); }
public void buildTopping () { pizza . setTopping ( "sonka+ananász" ); }
}
/** "ConcreteBuilder" */
class SpicyPizzaBuilder kiterjeszti PizzaBuilder {
public void buildDough () { pizza . setDough ( "serpenyőben sült" ); }
public void buildSauce () { pizza . setSauce ( "forró" ); }
public void buildTopping () { pizza . setTopping ( "pepperoni+szalámi" ); }
}
/** "Director" */
class Pincér {
privát PizzaBuilder pizzaBuilder ;
public void setPizzaBuilder ( PizzaBuilder pb ) { pizzaBuilder = pb ; }
public Pizza getPizza () { return pizzaBuilder . getPizza (); }
public void constructPizza () {
pizzaBuilder . CreateNewPizzaProduct ();
pizza Builder . buildDough ();
pizza Builder . buildSauce ();
pizza Builder . buildTopping ();
}
}
/** Pizzát rendelő vásárló. */
public class BuilderExample {
public static void main ( String [] args ) {
Pincér = new Pincér ( ); PizzaBuilder hawaiianPizzaBuilder = új HawaiianPizzaBuilder ( ); pincér . setPizzaBuilder ( hawaiianPizzaBuilder ); pincér . constructPizza ();
Pizza pizza = pincér . getPizza ();
}
}
Java forrás
// pattern Builder
public class NutritionFacts {
private final int servingSize ;
magán végső int adagok ;
privát végső int kalória ;
privát végső int zsír ;
magán végső int nátrium ;
privát végső int szénhidrát ;
public static class Builder {
// Kötelező paraméterek
private final int servingSize ;
magán végső int adagok ;
// További paraméterek - alapértelmezett értékekkel inicializálva
privát int kalória = 0 ;
privát int zsír = 0 ;
privát int szénhidrát = 0 ;
privát int nátrium = 0 ;
public Builder ( int servingSize , int servings ) {
this . servingSize = servingSize ;
ezt . adagok = adagok ;
}
public Builder kalória ( int val ) {
kalória = val ;
ezt visszaküldeni ; }
public Builder fat ( int val ) {
fat = val ;
ezt visszaküldeni ; }
public Builder szénhidrát ( int val ) {
szénhidrát = val ;
ezt visszaküldeni ; }
public Builder sodium ( int val ) {
nátrium = val ;
ezt visszaküldeni ; }
public NutritionFacts build () {
return new NutritionFacts ( this );
}
}
private NutritionFacts ( Builder builder ) {
servingSize = builder . adagméret ;
adagok = építő . adagok ;
kalória = építő . kalória ;
kövér = építő . zsír ;
nátrium = építő . nátrium ;
szénhidrát = építő . szénhidrát ;
}
}
// használat
NutritionFacts cocaCola = new NutritionFacts
. építő ( 240 , 8 )
. kalória ( 100 )
. nátrium ( 35 )
. szénhidrát ( 27 )
. épít ();
Scala forráskód
package.com _
csomag objektumkészítő { _
osztály pizza {
private var tészta : String = ""
private var szósz : String = ""
private var topping : String = ""
def setDough ( tészta : String ) : Egység = {
ez . tészta = tészta
_
def setSauce ( szósz : String ) : Unit = {
this . szósz = szósz
_
def setTopping ( topping : String ) : Unit = {
this . feltét = feltét
}
def outputReceipt () : Egység = {
println ( s"Tészta: $ tészta \nszósz: $ szósz \nöntet: $ öntet " )
}
}
abstract class AbstractPizzaBuilder {
védett var pizza : Opció [ Pizza ] = Nincs
def getPizza : Opció [ Pizza ] = pizza
def createPizza () : Egység = {
pizza = Néhány ( új pizza )
}
def buildDough () : egység
def buildSauce () : egység
def buildTopping () : egység
}
class HawaiianPizzaBuilder kiterjeszti AbstractPizzaBuilder {
def buildDough () felülírása : Unit = {
pizza . kap . setDough ( "kereszt" )
}
override def buildSauce () : Unit = {
pizza . kap . setSauce ( "enyhe" )
}
override def buildTopping () : Unit = {
pizza . kap . setTopping ( "sonka+ananász" )
}
}
class SpicyPizzaBuilder kiterjeszti AbstractPizzaBuilder {
def buildDough () felülírása : Unit = {
pizza . kap . setDough ( "serpenyőben sült" )
}
override def buildSauce () : Unit = {
pizza . kap . setSauce ( "forró" )
}
override def buildTopping () : Unit = {
pizza . kap . setTopping ( "paprika+szalámi" )
}
}
osztály pincér {
private var pizzaBuilder : Opció [ AbstractPizzaBuilder ] = Nincs
def setPizzaBuilder ( pizzaBuilder : AbstractPizzaBuilder ) : Unit = {
this . pizzaBuilder = Néhány ( pizzaBuilder )
println ( s" A ${ pizzaBuilder . getClass . getName } építő alapértelmezettként be van állítva" )
}
def createPizza () : Pizza = {
pizzaBuilder . kap . createPizza ()
pizzaBuilder . kap . buildDough ()
pizzaBuilder . kap . buildSauce ()
pizzaBuilder . kap . buildTopping ()
pizzaBuilder . kap . getPizza . kap
}
}
objectBuilderTest { _
def main ( args : Array [ String ]) : Unit = {
val pincér = new Waiter
println ( "Kimenet:" )
pincér . setPizzaBuilder ( új HawaiianPizzaBuilder )
pincér . CreatePizza (). outputReceipt ()
pincér . setPizzaBuilder ( új SpicyPizzaBuilder )
pincér . CreatePizza (). kimeneti nyugta ()
}
}
}
// Kimenet:
// A Builder com.builder.package$HawaiianPizzaBuilder alapértelmezettként van beállítva
// Tészta: kereszt
// Szósz: enyhe
// Feltöltés: sonka+ananász
// A Builder com.builder.package$SpicyPizzaBuilder van beállítva alapértelmezettként
/ / Tészta: serpenyőben sült
// Szósz: forró
// Felöntés: pepperoni+szalámi
Forrásszöveg C# nyelven
a rendszer használatával ;
a System.Collections.Generic használatával ;
namespace Builder
{
public class MainApp
{
public static void Fő ()
{
// Rendező és építők létrehozása
Director director = new Director ();
Builder b1 = új ConcreteBuilder1 ();
Builder b2 = új ConcreteBuilder2 ();
// Két
termékigazgató szerkesztése . Konstrukció ( b1 );
Termék p1 = b1 . GetResult ();
p1 . show ();
igazgató . Konstrukció ( b2 );
Termék p2 = b2 . GetResult ();
p2 . show ();
// Várja meg a felhasználói
konzolt . olvasni ();
}
}
// "Rendező"
class Director
{
// A Builder összetett lépéssorozatot használ
public void Construct ( Builder builder )
{
builder . BuildPart ();
építő . BuildPartB ();
}
}
// "Építő"
abstract class Builder
{
public virtual void BuildPartA (){}
public virtual void BuildPartB (){}
public abstract Product GetResult ();
}
// "ConcreteBuilder1"
class ConcreteBuilder1 : Builder
{
privát , csak olvasható Termék termék = új termék ();
public override void BuildPartA ()
{
termék . Add ( "A rész" );
}
public override void BuildPartB ()
{
termék . Add ( "PartB" );
}
public override Product GetResult ()
{
return product ;
}
}
// "ConcreteBuilder2"
class ConcreteBuilder2 : Builder
{
privát , csak olvasható Termék termék = új termék ();
public override void BuildPartA ()
{
termék . Add ( "PartX" );
}
public override void BuildPartB ()
{
termék . Add ( "Party" );
}
public override Product GetResult ()
{
return product ;
}
}
// "Termék"
class Termék
{
privát , csak olvasható Lista < string > részek = new Lista < string >();
public void Add ( string part )
{
parts . Hozzáadás ( rész );
}
public void Megjelenítés ()
{
Konzol . WriteLine ( "\nTermékrészek -------" );
foreach ( string rész részenként ) Konzol . _ WriteLine ( rész ); } } }
Forrásszöveg C++ nyelven
// Megvalósítás C++ nyelven.
#include <iostream>
#include <memória>
#include <karakterlánc>
//
Termékosztály Pizza
{
privát :
std :: szál tészta ;
std :: húrszósz ; _
std :: string topping ;
nyilvános :
Pizza () { }
~ Pizza () { }
void SetDough ( const std :: string & d ) { tészta = d ; }
void SetSauce ( const std :: string & s ) { souse = s ; }
void SetTopping ( const std :: string & t ) { topping = t ; }
érvénytelen ShowPizza ()
{
std :: cout << "fincsi!!!" << std :: endl
<< "Pizza tésztával mint" << tészta
<< ", Szósz mint " << szósz
<< "és Feltöltés mint" << feltöltés
<< "!!!" << std :: endl ;
}
};
// Abstract Builder
osztály PizzaBuilder
{
védett :
std :: shared_ptr < Pizza > pizza ;
nyilvános :
PizzaBuilder () {}
virtuális ~ PizzaBuilder () {}
std :: shared_ptr < Pizza > GetPizza () { return pizza ; }
void createNewPizzaProduct () { pizza . reset ( új Pizza ); }
virtuális void buildDough () = 0 ;
virtual void buildSauce () = 0 ;
virtuális void buildTopping () = 0 ;
};
// ConcreteBuilder
osztály HawaiianPizzaBuilder : nyilvános PizzaBuilder
{
nyilvános :
HawaiianPizzaBuilder () : PizzaBuilder () {}
~ HawaiianPizzaBuilder (){}
void buildDough () { pizza -> SetDough ( "kereszt" ); }
void buildSauce () { pizza -> SetSauce ( "enyhe" ); }
void buildTopping () { pizza -> SetTopping ( "sonka és ananász" ); }
};
// ConcreteBuilder
osztály SpicyPizzaBuilder : nyilvános PizzaBuilder
{
nyilvános :
SpicyPizzaBuilder () : PizzaBuilder () {}
~ SpicyPizzaBuilder () {}
void buildDough () { pizza -> SetDough ( "serpenyőben sült" ); }
void buildSauce () { pizza -> SetSauce ( "forró" ); }
void buildTopping () { pizza -> SetTopping ( "pepperoni és szalámi" ); }
};
// Rendező
osztály Pincér
{
privát :
PizzaBuilder * pizzaBuilder ;
nyilvános :
Pincér () : pizzaBuilder ( nullptr ) {}
~ Pincér () { }
void SetPizzaBuilder ( PizzaBuilder * b ) { pizzaBuilder = b ; }
std :: shared_ptr < Pizza > GetPizza () { return pizzaBuilder -> GetPizza (); }
érvénytelen ConstructPizza ()
{
pizzaBuilder -> CreateNewPizzaProduct ();
pizzaBuilder -> buildDough ();
pizzaBuilder -> buildSauce ();
pizzaBuilder -> buildTopping ();
}
};
// Az ügyfél két pizzát rendel.
int main ()
{
Pincér pincér ;
HawaiianPizzaBuilder hawaiianPizzaBuilder ;
pincér . SetPizzaBuilder ( & hawaiianPizzaBuilder );
pincér . ConstructPizza ();
std :: shared_ptr < Pizza > pizza = pincér . GetPizza ();
pizza -> ShowPizza ();
SpicyPizzaBuilder spicyPizzaBuilder ;
pincér . SetPizzaBuilder ( & spicyPizzaBuilder );
pincér . ConstructPizza ();
pizza = pincér . GetPizza ();
pizza -> ShowPizza ();
return EXIT_SUCCESS ;
}
JavaScript forráskód
// Termékfüggvény
Pizza ( ) {
var duplicate = this ; // állandó hivatkozás a példányosított objektumra, amelyet minden this
var tészta esetén meg kell hívni ;
var szósz ;
var öntet ;
ezt . setDough = function ( val ) {
tészta = val ;
};
ezt . setSauce = function ( val ) {
mártás = val ;
};
ezt . setTopping = function ( val ) {
topping = val ;
};
// a nyelv természetéből adódóan a gettereket (még ha nincs is rájuk szükségünk)
// ugyanabban a függvényben kell definiálni, mint a
this . getDough = function () {
return tészta ;
};
ezt . getSauce = function () {
return szósz ;
};
ezt . getTopping = function () {
return topping ;
};
// Létre kell hoznunk egy metódust, ami megváltoztatja egy már létrehozott objektum tulajdonságait
// (lásd createNewPizzaProduct)
ez . clear = function () {
duplicate . setDough ( undefined );
másodpéldány . setSauce ( undefined );
másodpéldány . setTopping ( undefined );
};
}
// Abstract Builder
function PizzaBuilder () {
var pizza = new Pizza ();
ezt . getPizza = function () {
return pizza ;
};
ezt . createNewPizzaProduct = function () {
// ha csak a pizza változó értékét változtatjuk meg, akkor a változás
// semmilyen módon nem érinti a gyermekosztályokat, mert bennük a változó pizza
// a "régi" memóriaterületre utal
. tiszta (); // ha a megvalósításokon belül (HawaiianPizzaBuilder, SpicyPizzaBuilder) // a pizza változó helyett a getPizza metódust használjuk, // akkor a // pizza = new Pizza(); // és a Pizzának nem lesz szüksége az egyértelmű metódusra };
ezt . buildDough = function ( val ) { };
ezt . buildSauce = function ( val ) { };
ezt . buildTopping = function ( val ) { };
}
// ConcreteBuilder
function HawaiianPizzaBuilder () {
PizzaBuilder . hívja ( ezt );
var pizza = ez . getPizza (); // védett szimuláció
ezt . buildDough = function () { pizza . setDough ( "kereszt" ); };
ezt . buildSauce = function () { pizza . setSauce ( "enyhe" ); };
ezt . buildTopping = function () { pizza . setTopping ( "sonka+ananász" ); };
}
function SpicyPizzaBuilder () {
PizzaBuilder . hívja ( ezt );
var pizza = ez . getPizza ();
ezt . buildDough = function () { pizza . setDough ( "serpenyőben sült" ); };
ezt . buildSauce = function () { pizza . setSauce ( "forró" ); };
ezt . buildTopping = function () { pizza . setTopping ( "pepperoni+szalámi" ); };
}
// Irányító
függvény Pincér () {
var pizzaBuilder ;
ezt . setPizzaBuilder = function ( builder ) {
pizzaBuilder = builder ;
};
ezt . getPizza = function () {
return pizzaBuilder . getPizza ();
};
ezt . constructPizza = function () {
pizzaBuilder . CreateNewPizzaProduct ();
pizza Builder . buildDough ();
pizza Builder . buildSauce ();
pizza Builder . buildTopping ();
};
}
// Az ügyfél két pizzát rendel
var pizza ;
var pincér = new Pincér ();
var hawaiianPizzaBuilder = új HawaiianPizzaBuilder ();
pincér . setPizzaBuilder ( hawaiianPizzaBuilder );
pincér . constructPizza ();
pizza = pincér . getPizza ();
figyelmeztetés ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );
var spicyPizzaBuilder = új SpicyPizzaBuilder ();
pincér . setPizzaBuilder ( spicyPizzaBuilder );
pincér . constructPizza ();
pizza = pincér . getPizza ();
figyelmeztetés ( pizza . getDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );
Forráskód Pythonban
#kódolás: utf-8
osztály Állat :
"""
Absztrakt állat
"""
lábak = 0
farok = hamis
ordítás = ''
osztály Mutátor :
"""
Reprodukcióért felelős
"""
def mute ( self ):
self . állat = Állat ()
class Cat ( Mutátor ):
"""
Cat
"""
def create_legs ( self ):
self . állat . lábak = 4
def create_tail ( self ):
self . állat . farok = Igaz
def create_roar ( self ):
self . állat . üvölt = 'meowww!'
osztály Kutya ( Mutátor ):
"""
Kutya
"""
def create_legs ( self ):
self . állat . lábak = 4
def create_tail ( self ):
self . állat . farok = Igaz
def create_roar ( self ):
self . állat . ordít = 'woffff!'
class AnimalOwner :
"" "
Állattulajdonos
"""
__mutator = ''
def set_animal ( self , mutator ):
self . __mutátor = mutátor
def create_an_animal_for_me ( self ):
self . __mutátor . mutál ()
én . __mutátor . create_legs ()
self . __mutátor . create_tail ()
self . __mutátor . Create_roar ()
def get_animal ( self ):
return self . __mutátor . állat
c = Macska ()
d = Kutya ()
ao = Állattulajdonos ()
ao . set_animal ( c )
stb . create_an_animal_for_me ()
animal = ao . get_animal ()
print animal . ordít #meowww !
PHP forráskód
<?php
/**
* Mintaépítő, ismert "építési receptekkel" működik
*/
/**
* Pizza - Alapépület objektum
*/
class Pizza {
private $_pastry = "" ;
private $_sauce = "" ;
private $_garniture = "" ;
public function setPastry ( $tészta ) {
$this -> _pastry = $tészta ;
}
public function setSauce ( $szósz ) {
$this -> _sauce = $szósz ;
}
public function setGarniture ( $garniture ) {
$this -> _garniture = $garniture ;
}
}
/**
* Builder – Abstract builder
*/
abstract class BuilderPizza {
védett $_pizza ;
public function getPizza () {
return $this -> _pizza ;
}
public function createNewPizza () {
$this -> _pizza = new Pizza ();
}
absztrakt nyilvános függvény buildPastry ();
absztrakt nyilvános funkció buildSauce ();
absztrakt nyilvános funkció buildGarniture ();
}
/**
* BuilderConcret - Concrete builder 1
*/
class BuilderPizzaHawaii kiterjeszti BuilderPizza {
public function buildPastry () {
$this -> _pizza -> setPastry ( "normál" );
}
public function buildSauce () {
$this -> _pizza -> setSauce ( "soft" );
}
public function buildGarniture () {
$this -> _pizza -> setGarniture ( "jambon+ananas" );
}
}
/**
* BuilderConcret - Concrete builder 2
*/
class BuilderPizzaSpicy kiterjeszti BuilderPizza {
public function buildPastry () {
$this -> _pizza -> setPastry ( "puff" );
}
public function buildSauce () {
$this -> _pizza -> setSauce ( "forró" );
}
public function buildGarniture () {
$this -> _pizza -> setGarniture ( "pepperoni+szalámi" );
}
}
/**
* Rendező - Vezérlő osztály, amely elindítja az építkezést
* PizzaBuilder - A Builder minta megvalósítása, amely a pizzakészítési folyamat delegálását mutatja a constructPizza metódusra
*/
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 inicializálása
$pizzaBuilder = new PizzaBuilder ();
// Elérhető termékek inicializálása
$builderPizzaHawaii = new BuilderPizzaHawaii ();
$builderPizzaPicante = új BuilderPizzaSpicy ();
// A termék előkészítése és beszerzése
$pizzaBuilder -> setBuilderPizza ( $builderPizzaHawaii );
$pizzaBuilder -> constructPizza ();
$pizza = $pizzaBuilder -> getPizza ();
Ruby forráskód
#
# Alapépület objektum
#
osztály Pizza
attr_accessor :tészta , :szósz , :garniture
end
#
# Builder - osztályépítő
#
class BuilderPizza
attr_reader :pizza
def create_new_pizza
@pizza = Pizza . új
vég
def get_pizza
"Az Ön rendelése. péksütemény: #{ @pizza . péksütemény } , szósz: #{ @pizza . szósz } , körítés : #{ @pizza . garniture } "
vége
#
# BuilderConcret - Concrete builder 1
#
class BuilderPizzaHawaii < BuilderPizza
def build_pastry
@pizza . péksütemény = 'normál'
vége
def build_sauce
@pizza . szósz = 'puha'
vége
def build_garniture
@pizza . garniture = 'jambon+ananas'
end
end end
#
# BuilderConcret - Concrete builder 2
#
class BuilderPizzaSpicy < BuilderPizza
def build_pastry
@pizza . péksütemény = 'felfújt'
vége
def build_sauce
@pizza . szósz = 'forró'
vége
def build_garniture
@pizza . garniture = 'papperoni+szalámi
' végvég
#
# Rendező – A felépítést elindító menedzser osztály
#
class Waiter
def set_builder_pizza ( bp )
@builder_pizza = bp
end
def get_pizza
@builder_pizza . get_pizza
end
def construct_pizza
@builder_pizza . létrehozás_új_pizza @builder_pizza
. build_pastry @builder_pizza . build_szósz @builder_pizza . build_garniture end end
pincér = Pincér . új
builder_pizza_hawaii = ÉpítőPizzaHawaii . new
builder_pizza_spicy = BuilderPizzaSpicy . új
pincér . set_builder_pizza ( builder_pizza_hawaii )
pincér . construct_pizza
pincért tesz . get_pizza
Forrásszöveg Delphiben
program BuilderPatternExample ;
{$APPTYPE CONSOLE}
SysUtils-t használ ;
típus
// Termék
TPizza = osztály ( TObject )
szigorú privát
FDough , FSauce , FTopping : string ;
köztulajdon
Tészta : string write FDough ; _ property Sauce : string write FSauce ; property Topping : string írás FTopping ; eljárás Mutasd ; vége ;
// Abstract Builder
TPizzaBuilder = osztály ( TObject )
szigorúan védett
FPizza : TPizza ;
köztulajdon
Pizza : TPizza olvas FPizza ; _
konstruktor Create ;
destructor Elpusztítani ; felülbírálni ;
eljárás CreateNewPizzaProduct ;
eljárás FreePizzaProduct ;
eljárás BuildDough ; virtuális ; absztrakt ;
eljárás BuildSauce ; virtuális ; absztrakt ;
eljárás BuildTopping ; virtuális ; absztrakt ;
vége ;
// Concrete Builder A
THawaiianPizzaBuilder = osztály ( TPizzaBuilder )
nyilvános
eljárás BuildDough ; felülbírálni ;
eljárás BuildSauce ; felülbírálni ;
eljárás BuildTopping ; felülbírálni ;
vége ;
// Concrete Builder B
TSpicyPizzaBuilder = osztály ( TPizzaBuilder )
nyilvános
eljárás BuildDough ; felülbírálni ;
eljárás BuildSauce ; felülbírálni ;
eljárás BuildTopping ; felülbírálni ;
vége ;
// Director
TPincér = class ( TObject )
szigorú privát
FPizzaBuilder : TPizzaBuilder ;
köztulajdon
PizzaBuilder : TPizzaBuilder írjon FPIzzaBuilder ; _
konstruktor Create ;
destructor Elpusztítani ; felülbírálni ;
eljárás ConstructPizza ;
eljárás FreePizza ;
funkció GetPizza : TPizza ;
vége ;
{TPizza}
eljárás TPizza . show ;
begin
WriteLn ( 'Pizza tésztával mint ' + FDough + ', szósz mint ' + FSauce + ' és Feltöltés mint ' + FTopping + '!' ) ;
vége ;
{TPizzaBuilder}
kivitelező TPizzaBuilder . létrehozni ;
kezdeni
FPizza := nulla ;
vége ;
destructor TPizzaBuilder . elpusztítani ;
start FreePizzaProduct
; öröklött Pusztítás ; vége ;
eljárás TPizzaBuilder . Ingyenes pizzatermék ;
kezdődik
if FPizza <> nil then
FreeAndNil ( FPizza ) ;
vége ;
eljárás TPizzaBuilder . CreateNewPizzaProduct ;
kezdődik
ha FPizza <> nil then
FPizza . Ingyenes ;
FPizza := TPizza . létrehozni ;
vége ;
{THawaiianPizzaBuilder}
eljárás THawaiianPizzaBuilder . BuildDough ;
kezdődik
ha FPizza <> nil then
FPizza . Tészta := 'kereszt' ;
vége ;
eljárás THawaiianPizzaBuilder . BuildSauce ;
kezdődik
ha FPizza <> nil then
FPizza . Szósz := 'enyhe' ;
vége ;
eljárás THawaiianPizzaBuilder . BuildTopping ;
kezdődik
ha FPizza <> nil then
FPizza . Feltöltés := 'sonka és ananász' ;
vége ;
{ TSpicyPizzaBuilder }
eljárás TSpicyPizzaBuilder . BuildDough ;
kezdődik
ha FPizza <> nil then
FPizza . Tészta := 'serpenyős' ;
vége ;
eljárás TSpicyPizzaBuilder . BuildSauce ;
kezdődik
ha FPizza <> nil then
FPizza . Szósz := 'forró' ;
vége ;
eljárás TSpicyPizzaBuilder . BuildTopping ;
kezdődik
ha FPizza <> nil then
FPizza . Feltöltés := 'pepperoni és szalámi' ;
vége ;
{Tpincér}
konstruktor Tpincér . létrehozni ;
kezdődjön
az FPizzaBuilder := null ;
vége ;
destructor Tpincér . elpusztítani ;
kezdődjön
az FPizzaBuilder := null ;
öröklött Pusztítás ;
vége ;
eljárás TPincér . FreePizza ;
kezdődik
, ha FPIzzaBuilder <> nil then
FPizzaBuilder . Ingyenes pizzatermék ;
vége ;
eljárás TPincér . Construct Pizza ;
Kezdje , ha FPIzzaBuilder <> nulla , majd kezdje
el az FPizzaBuildert . CreateNewPizzaProduct ; FPizzaBuilder . BuildDough ; FPizzaBuilder . BuildSauce ; FPizzaBuilder . BuildTopping ; vége ; vége ;
funkció Tpincér . GetPizza : TPizza ;
kezdődik
, ha FPIzzaBuilder <> nil then
Eredmény := FPIzzaBuilder . Pizza
más
Eredmény := null ;
vége ;
eljárás ConstructAndShowPizza ( Pincér : TWaiter ; Építő : TPizzaBuilder ) ;
var
Pizza : TPizza ;
kezdje
Pincér . PizzaBuilder := Építő ;
pincér . Construct Pizza ;
Pizza := Pincér . GetPizza ;
próbáld
ki a Pizzát . show ;
végre
Pincér . FreePizza ;
vége ;
vége ;
var
Pincér : TPincér ;
HawaiianPizzaBuilder : THawaiianPizzaBuilder ;
SpicyPizzaBuilder : TSpicyPizzaBuilder ;
kezdődik
HawaiianPizzaBuilder := null ;
SpicyPizzaBuilder := nulla ;
Pincér := nulla ;
próbáld ki a
HawaiianPizzaBuilder := THawaiianPizzaBuilder alkalmazást . létrehozni ;
SpicyPizzaBuilder := TSpicyPizzaBuilder . létrehozni ;
Pincér := T Pincér . létrehozni ;
// Az ügyfél két pizzát rendelt
ConstructAndShowPizza ( Pincér , HawaiianPizzaBuilder ) ;
ConstructAndShowPizza ( pincér , SpicyPizzaBuilder ) ;
végre
Pincér . Ingyenes ;
HawaiianPizzaBuilder . Ingyenes ;
SpicyPizzaBuilder . Ingyenes ;
vége ;
Readln ;
vége .
Forrásszöveg VB.NET nyelven
Importálás Rendszer.Gyűjtemények.Általános
Névtér- építő
Nyilvános osztály MainApp
Nyilvános megosztott al - fő ()
' Rendező és építők létrehozása
Dim igazgató új igazgatóként ()
Dim b1 As Builder = Új ConcreteBuilder1 ()
Dim b2 As Builder = Új ConcreteBuilder2 ()
' Construct két termék
igazgatója . Konstrukció ( b1 )
Dim p1 As Product = b1 . GetResult ()
p1 . Mutasd ()
igazgató . Konstrukció ( b2 )
Dim p2 As Product = b2 . GetResult ()
p2 . Mutasd ()
Várja meg a felhasználói
konzolt . Olvassa el ()
End Sub
End Class
"Director"
Class Director
' Builder egy összetett lépéssorozatot használ
Public Sub Construct ( ByVal builder as Builder )
builder . BuildPartA ()
builder . BuildPartB ()
End Sub
End Class
' "Builder"
Must Inherit Class Builder
Public MustOverride Sub BuildPartA ()
Public MustOverride Sub BuildPartB ()
Public MustOverride Function GetResult ( ) A termék
végosztályaként
' "ConcreteBuilder1"
osztály ConcreteBuilder1
örökli a Builder
privát , csak olvasható terméket új termékként ( )
Nyilvános felülbírálja Sub BuildPartA ()
termék . Add ( "A rész" )
End Sub
Nyilvános felülbírálja Sub BuildPartB ()
termék . Add ( "PartB" )
End Sub
Nyilvános felülbírálja a GetResult () függvényt , mint a termék visszaadását , a termék befejező funkcióját , az utolsó osztályt
' "ConcreteBuilder2"
osztály A ConcreteBuilder2 megörökli
a Builder
privát , csak olvasható terméket új termékként ()
Nyilvános felülbírálja Sub BuildPartA ()
termék . Add ( "PartX" )
End Sub
Nyilvános felülbírálja Sub BuildPartB ()
termék . Add ( "PartY" )
End Sub
Nyilvános felülbírálja a GetResult () függvényt , mint a termék visszaadását , a termék befejező funkcióját , az utolsó osztályt
"Termék"
osztály Termék
Privát Csak olvasható részek Új listaként ( karakterláncból ) ( )
Public Sub Add ( ByVal part As String )
részek . Add ( rész )
End Sub
Nyilvános alműsor ( )
Konzol . WriteLine ( vbLf & " Termékrészek -------" )
Minden alkatrészhez String In Part konzolként . WriteLine ( rész ) Következő vége Alvége Osztályvég Névtér _ _
Jegyzetek
Linkek