Constructor (patrón de diseño)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 23 de noviembre de 2014; las comprobaciones requieren 30 ediciones .
Constructor
Constructor
Tipo de generando
ventajas

Le permite cambiar la representación interna del producto. Aísla el código que implementa la construcción y la presentación.

Brinda un control más preciso sobre el proceso de construcción que otros patrones generativos.
Plantillas relacionadas Fábrica abstracta , Enlazador
Descrito en Patrones de diseño

Constructor : un  patrón de diseño generativo proporciona una forma de crear un objeto compuesto.

Propósito

Separa la construcción de un objeto complejo de su representación, de manera que un mismo proceso de construcción puede dar lugar a diferentes representaciones.

Ventajas

Contras

Aplicación

Los objetos de moniker en COM son constructores que se inicializan con una cadena. Además, para crearlos, se utiliza otro constructor: MkParseDisplayNameEx, que determina la clase de moniker a partir de la cadena, crea el moniker y lo inicializa con la misma cadena.

Uno de estos objetos, URL Moniker, se utiliza para la carga de todas las páginas, archivos adjuntos y documentos en Microsoft Internet Explorer.

Ejemplos

Java

Fuente Java /** "Producto" */ class Pizza { private String masa = "" ; Salsa de cadena privada = "" ; topping de cadena privada = "" ; public void setDough ( masa de hilo ) { this . masa = masa ; } public void setSauce ( String salsa ) { esto . salsa = salsa ; } public void setTopping ( String topping ) { this . topping = topping ; } } /** "Constructor abstracto" */ clase abstracta PizzaBuilder { protected Pizza pizza ; pizza pública getPizza () { return pizza ; } public void crearNuevoProductoPizza () { pizza = nueva Pizza (); } public abstract void buildDough (); public abstract void buildSauce (); public abstract void buildTopping (); } /** "ConcreteBuilder" */ class HawaiianPizzaBuilder extends PizzaBuilder { public void buildDough () { pizza . setMasa ( "cruz" ); } public void buildSauce () { pizza . setSauce ( "suave" ); } public void buildTopping () { pizza . setTopping ( "jamon+piña" ); } } /** "ConcreteBuilder" */ class SpicyPizzaBuilder extends PizzaBuilder { public void buildDough () { pizza . setDough ( "pan-horneado" ); } public void buildSauce () { pizza . setSauce ( "picante" ); } public void buildTopping () { pizza . setTopping ( "pepperoni+salami" ); } } /** "Director" */ class Camarero { private PizzaBuilder pizzaBuilder ; public void setPizzaBuilder ( PizzaBuilder pb ) { pizzaBuilder = pb ; } pizza pública getPizza () { return pizzaBuilder . obtenerPizza (); } public void constructPizza () { pizzaBuilder . crearNuevoProductoPizza (); constructor de pizzas . construirMasa (); constructor de pizzas . construirSalsa (); constructor de pizzas . buildTopping (); } } /** Un cliente ordenando una pizza. */ public class BuilderExample { public static void main ( String [] args ) { Waiter waiter = new Waiter (); PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder (); camarero _ setPizzaBuilder ( hawaianoPizzaBuilder ); camarero _ construirPizza (); Pizza pizza = camarero . obtenerPizza (); } }


Fuente Java // Generador de patrones public class NutritionFacts { private final int serveSize ; raciones internas finales privadas ; calorías int finales privadas ; grasa int final privada ; sodio int final privado ; carbohidrato int final privado ; public static class Builder { // Parámetros requeridos private final int serveSize ; raciones internas finales privadas ; // Parámetros adicionales: inicializados con valores predeterminados calorías privadas int = 0 ; gordo int privado = 0 ; carbohidrato int privado = 0 ; sodio int privado = 0 ; Constructor público ( int tamaño de la porción , int porciones ) { this . tamañoServición = tamañoServición ; esto _ raciones = raciones ; } public Builder calorías ( int val ) { calorías = val ; devolver esto ; } public Builder gordo ( int val ) { gordo = val ; devolver esto ; } public Builder carbohidrato ( int val ) { carbohidrato = val ; devolver esto ; } Public Builder sodio ( int val ) { sodio = val ; devolver esto ; } Public NutritionFacts build () { return new NutritionFacts ( this ); } } Datos nutricionales privados ( constructor constructor ) { tamaño de la porción = constructor . tamaño de la porción ; porciones = constructor . raciones ; calorías = constructor . calorías ; gordo = constructor . grasa _ sodio = constructor . sodio ; carbohidrato = constructor . carbohidrato ; } } // uso NutritionFacts cocaCola = new NutritionFacts . constructor ( 240 , 8 ) . calorías ( 100 ) . sodio ( 35 ) . carbohidrato ( 27 ) . construir ();


escala

Código fuente de Scala paquete.com _ generador de objetos de paquete { clase de pizza { masa var privada : String = "" salsa var privada : String = "" cobertura var privada : String = "" def setDough ( masa : Cadena ) : Unidad = { esto . masa = masa _ def setSauce ( salsa : String ) : Unidad = { this . salsa = salsa _ def setTopping ( topping : String ) : Unidad = { this . cobertura = cobertura } def salidaRecibo () : Unidad = { println ( s"Masa: $ masa \nSalsa: $ salsa \nCobertura: $ cobertura " ) } } clase abstracta AbstractPizzaBuilder { pizza var protegida : Opción [ Pizza ] = Ninguno def getPizza : Opción [ Pizza ] = pizza def createPizza () : Unidad = { pizza = Algunas ( pizza nueva ) } def buildDough () : Unidad def buildSauce () : Unidad def buildTopping () : Unidad } clase HawaiianPizzaBuilder extiende AbstractPizzaBuilder { override def buildDough () : Unidad = { pizza . obtener _ setMasa ( "cruz" ) } override def buildSauce () : Unidad = { pizza . obtener _ setSauce ( "suave" ) } override def buildTopping () : Unidad = { pizza . obtener _ setTopping ( "jamón+piña" ) } } clase SpicyPizzaBuilder extiende AbstractPizzaBuilder { override def buildDough () : Unidad = { pizza . obtener _ setDough ( "al horno" ) } override def buildSauce () : Unidad = { pizza . obtener _ setSauce ( "picante" ) } override def buildTopping () : Unidad = { pizza . obtener _ setTopping ( "pepperoni+salami" ) } } camarero de clase { var privado pizzaBuilder : Opción [ AbstractPizzaBuilder ] = Ninguno def setPizzaBuilder ( pizzaBuilder : AbstractPizzaBuilder ) : Unidad = { this . pizzaBuilder = Some ( pizzaBuilder ) println ( s"Builder ${ pizzaBuilder . getClass . getName } está configurado como predeterminado" ) } def createPizza () : Pizza = { pizzaBuilder . obtener _ crearPizza () constructor de pizzas . obtener _ construir masa () constructor de pizza . obtener _ buildSauce () constructor de pizza . obtener _ buildTopping () pizzaBuilder . obtener _ obtenerPizza . obtener } } prueba del constructor de objetos { _ def main ( args : Array [ String ]) : Unit = { val waiter = new Waiter println ( "Salida:" ) waiter . setPizzaBuilder ( nuevo HawaiianPizzaBuilder ) camarero . crearPizza (). salidaReceipt () camarero . setPizzaBuilder ( nuevo SpicyPizzaBuilder ) camarero . crearPizza (). recibo de salida () } } } // Salida: // El constructor com.builder.package$HawaiianPizzaBuilder está configurado como predeterminado // Masa: cruzada // Salsa: suave // ​​Topping: jamón+piña // El generador com.builder.package$SpicyPizzaBuilder está configurado como predeterminado / / Masa: al horno // Salsa: picante // Cobertura: pepperoni+salami

C#

Texto fuente en C# utilizando el sistema ; usando System.Collections.Generic ; Generador de espacio de nombres { public class MainApp { public static void Main () { // Crear director y constructores Director director = nuevo Director (); Constructor b1 = new ConcreteBuilder1 (); Constructor b2 = new ConcreteBuilder2 (); // Construir dos productos director . Construir ( b1 ); Producto p1 = b1 . ObtenerResultado (); p1 . mostrar (); directora _ Construir ( b2 ); Producto p2 = b2 . ObtenerResultado (); p2 . mostrar (); // Esperar a la Consola del usuario . leer (); } } // "Director" class Director { // Builder utiliza una serie compleja de pasos public void Construct ( Builder builder ) { builder . ConstruirParte (); constructor _ ConstruirParteB (); } } // "Constructor" constructor de clase abstracta { public virtual void BuildPartA (){} public virtual void BuildPartB (){} public abstract Product GetResult (); } // "ConstructorConcreto1" clase ConcreteBuilder1 : Builder { producto de solo lectura privado producto = nuevo Producto (); public override void BuildPartA () { producto . Agregar ( "Parte A" ); } public override void BuildPartB () { producto . Agregar ( "Parte B" ); } public override Producto GetResult () { producto de retorno ; } } // "ConstructorConcreto2" class ConcreteBuilder2 : Builder { producto de solo lectura privado producto = nuevo Producto (); public override void BuildPartA () { producto . Añadir ( "ParteX" ); } public override void BuildPartB () { producto . Agregar ( "Fiesta" ); } public override Producto GetResult () { producto de retorno ; } } // "Producto" class Producto { lista privada de solo lectura < cadena > partes = nueva lista < cadena >(); public void Añadir ( cadena parte ) { partes . Añadir ( parte ); } public void Mostrar () { Consola . WriteLine ( "\nPiezas del producto -------" ); foreach ( cadena parte en partes ) Console . WriteLine ( parte ); } } }

C++

Texto fuente en C++ // Implementación en C++. #incluir <iostream> #include <memoria> #incluir <cadena> // Clase de producto Pizza { privado : std :: hilo de masa ; std :: stringsauce ; _ std :: tope de cadena ; público : pizza () { } ~ Pizza () { } void SetDough ( const std :: cadena & d ) { masa = d ; } void SetSauce ( const std :: cadena & s ) { salsa = s ; } void SetTopping ( const std :: string & t ) { topping = t ; } vacío ShowPizza () { std :: cout << "Delicioso!!!" << std :: endl << "Pizza con masa como" << masa << ", Salsa como " << salsa << "y Topping como" << topping << "!!!" << std :: endl ; } }; // Clase de constructor abstracto PizzaBuilder { protegido : std :: shared_ptr < Pizza > pizza ; público : constructor de pizzas () {} virtual ~ PizzaBuilder () {} std :: shared_ptr < Pizza > GetPizza () { return pizza ; } void crearNuevoProductoPizza () { pizza . restablecer ( nueva pizza ); } virtual void buildDough () = 0 ; buildSauce vacío virtual () = 0 ; buildTopping vacío virtual () = 0 ; }; // clase ConcreteBuilder HawaiianPizzaBuilder : public PizzaBuilder { público : Constructor de pizza hawaiana () : Constructor de pizza () {} ~ Creador de pizza hawaiana (){} void buildDough () { pizza -> SetDough ( "cruz" ); } void buildSauce () { pizza -> SetSauce ( "suave" ); } void buildTopping () { pizza -> SetTopping ( "jamón y piña" ); } }; // clase ConcreteBuilder SpicyPizzaBuilder : public PizzaBuilder { público : Constructor de pizza picante () : Constructor de pizza () {} ~ Constructor de pizza picante () {} void buildDough () { pizza -> SetDough ( "pan horneado" ); } void buildSauce () { pizza -> SetSauce ( "caliente" ); } void buildTopping () { pizza -> SetTopping ( "pepperoni y salami" ); } }; // Clase de director Camarero { privado : Constructor de pizzas * Constructor de pizzas ; público : Camarero () : pizzaBuilder ( nullptr ) {} ~ Camarero () { } void SetPizzaBuilder ( PizzaBuilder * b ) { pizzaBuilder = b ; } std :: shared_ptr < Pizza > GetPizza () { return pizzaBuilder -> GetPizza (); } vacío ConstructPizza () { constructorpizza -> crearNuevoProductoPizza (); constructor de pizza -> construir masa (); constructor de pizza -> compilar salsa (); pizzaBuilder -> buildTopping (); } }; // El cliente pide dos pizzas. int principal () { camarero camarero ; constructor de pizza hawaiana constructor de pizza hawaiana ; camarero _ SetPizzaBuilder ( & hawaianoPizzaBuilder ); camarero _ ConstructPizza (); std :: shared_ptr < Pizza > pizza = mesero . ObtenerPizza (); pizza -> MostrarPizza (); SpicyPizzaBuilder picantePizzaBuilder ; camarero _ SetPizzaBuilder ( & picantePizzaBuilder ); camarero _ ConstructPizza (); pizzero = mesero . ObtenerPizza (); pizza -> MostrarPizza (); devuelve SALIR_ÉXITO ; }

JavaScript

Código fuente JavaScript // Función del producto Pizza () { var duplicate = this ; // referencia constante al objeto instanciado que se llamará para cualquiera de esta var masa ; salsa var ; cobertura de var ; esto _ setMasa = function ( val ) { masa = val ; }; esto _ setSauce = función ( val ) { salsa = val ; }; esto _ setTopping = función ( val ) { topping = val ; }; // debido a la naturaleza del lenguaje, los captadores (incluso si no los necesitamos) // deben definirse en la misma función que las variables locales this . getDough = función () { retornar masa ; }; esto _ getSauce = function () { return salsa ; }; esto _ getTopping = function () { return topping ; }; // tenemos que crear un método que cambie las propiedades de un objeto ya creado // (ver createNewPizzaProduct) this . claro = función () { duplicado . setMasa ( indefinido ); duplicar _ setSalsa ( indefinido ); duplicar _ setTopping ( indefinido ); }; } // Función Abstract Builder PizzaBuilder () { var pizza = new Pizza (); esto _ obtenerPizza = function () { devolver pizza ; }; esto _ createNewPizzaProduct = function () { // si solo cambiamos el valor de la variable pizza, entonces el cambio // no afectará a las clases secundarias de ninguna manera, porque dentro de ellos, la variable pizza // se refiere al área de memoria "antigua" pizza . claro (); // si dentro de las implementaciones (HawaiianPizzaBuilder, SpicyPizzaBuilder) // usamos el método getPizza en lugar de la variable pizza, // entonces podemos usar // pizza = new Pizza(); // y Pizza no necesitará el método clear }; esto _ construirMasa = función ( val ) { }; esto _ construirSalsa = function ( val ) { }; esto _ buildTopping = función ( val ) { }; } // función ConcreteBuilder HawaiianPizzaBuilder () { PizzaBuilder . llamar ( esto ); var pizza = esto . obtenerPizza (); // simular protegido esto _ construir masa = función () { pizza . setMasa ( "cruz" ); }; esto _ buildSauce = function () { pizza . setSauce ( "suave" ); }; esto _ buildTopping = function () { pizza . setTopping ( "jamon+piña" ); }; } función SpicyPizzaBuilder () { PizzaBuilder . llamar ( esto ); var pizza = esto . obtenerPizza (); esto _ construir masa = función () { pizza . setDough ( "pan-horneado" ); }; esto _ buildSauce = function () { pizza . setSauce ( "picante" ); }; esto _ buildTopping = function () { pizza . setTopping ( "pepperoni+salami" ); }; } // Función de director Camarero () { var pizzaBuilder ; esto _ setPizzaBuilder = function ( constructor ) { pizzaBuilder = constructor ; }; esto _ getPizza = función () { return pizzaBuilder . obtenerPizza (); }; esto _ constructPizza = función () { pizzaBuilder . crearNuevoProductoPizza (); constructor de pizzas . construirMasa (); constructor de pizzas . construirSalsa (); constructor de pizzas . buildTopping (); }; } // El cliente pide dos pizzas var pizza ; var camarero = nuevo camarero (); var hawaiianPizzaBuilder = new HawaiianPizzaBuilder (); camarero _ setPizzaBuilder ( hawaianoPizzaBuilder ); camarero _ construirPizza (); pizzero = mesero . obtenerPizza (); alert ( pizza . obtenerDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () ); var picantePizzaBuilder = new SpicyPizzaBuilder (); camarero _ setPizzaBuilder ( picantePizzaBuilder ); camarero _ construirPizza (); pizzero = mesero . obtenerPizza (); alert ( pizza . obtenerDough () + ", " + pizza . getSauce () + ", " + pizza . getTopping () );

Pitón

Código fuente en Python #codificación: clase utf-8 Animal : """ Abstract Animal """ piernas = 0 cola = Falso rugido = '' class Mutator : """ Responsable de la reproducción """ def mutate ( self ): self . animal = animal () clase Cat ( mutador ): """ Cat """ def create_legs ( self ): self . animales _ piernas = 4 def create_tail ( auto ): auto . animales _ cola = Verdadero def create_roar ( auto ): auto . animales _ rugido = 'miauuu!' clase Perro ( mutador ): """ Perro """ def create_legs ( self ): self . animales _ piernas = 4 def create_tail ( auto ): auto . animales _ cola = Verdadero def create_roar ( auto ): auto . animales _ rugido = '¡guau!' class AnimalOwner : """ Animal Owner """ __mutator = '' def set_animal ( self , mutator ): self . __mutador = mutador def create_an_animal_for_me ( self ): self . __mutador . mutar () auto . __mutador . crear_piernas () auto . __mutador . create_tail () auto . __mutador . crear_rugido () def get_animal ( self ): return self . __mutador . animal c = Gato () d = Perro () ao = AnimalOwner () ao . conjunto_animal ( c ) ao . crear_un_animal_para_mi () animal = ao . get_animal () imprimir animal . ruge #miauuu !

PHP5

codigo fuente php <?php /** * Creador de patrones, funciona con "recetas de construcción" conocidas */ /** * Pizza - Objeto de construcción base */ class Pizza { privado $_pastelería = "" ; privado $_salsa = "" ; privado $_guarnición = "" ; public function setPastelería ( $pastelería ) { $esto -> _pastelería = $pastelería ; } public function setSalsa ( $salsa ) { $esto -> _salsa = $salsa ; } public function setGarniture ( $ guarnición ) { $this -> _garniture = $ guarnición ; } } /** * Constructor - Constructor abstracto */ clase abstracta BuilderPizza { protegido $_pizza ; public function getPizza () { return $this -> _pizza ; } public function crearNuevaPizza () { $esto -> _pizza = nueva Pizza (); } función pública abstracta buildPastry (); función pública abstracta buildSauce (); función pública abstracta buildGarniture (); } /** * BuilderConcret - Constructor de hormigón 1 */ class BuilderPizzaHawaii extends BuilderPizza { función pública buildPastry () { $this -> _pizza -> setPastry ( "normal" ); } public function buildSauce () { $this -> _pizza -> setSauce ( "suave" ); } función pública buildGarniture () { $this -> _pizza -> setGarniture ( "jambon+ananas" ); } } /** * BuilderConcret - Constructor de hormigón 2 */ class BuilderPizzaSpicy extends BuilderPizza { función pública buildPastry () { $this -> _pizza -> setPastry ( "puff" ); } función pública buildSauce () { $this -> _pizza -> setSauce ( "caliente" ); } función pública buildGarniture () { $this -> _pizza -> setGarniture ( "pepperoni+salami" ); } } /** * Director - Clase de control que inicia la construcción * PizzaBuilder - Implementación del patrón Builder, mostrando la delegación del proceso de creación de pizza al método 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 (); $esto -> _builderPizza -> buildSauce (); $esto -> _builderPizza -> buildGarniture (); } } // Inicialización de pizza $pizzaBuilder = new PizzaBuilder (); // Inicializa los productos disponibles $builderPizzaHawaii = new BuilderPizzaHawaii (); $builderPizzaPicante = new BuilderPizzaSpicy (); // Preparando y obteniendo el producto $pizzaBuilder -> setBuilderPizza ( $builderPizzaHawaii ); $pizzaBuilder -> construirPizza (); $pizza = $constructorpizza -> getPizza ();

Rubí

código fuente rubí # # Objeto de construcción base # clase Pizza attr_accessor :pastelería , :salsa , :guarnición final # # Builder - constructor de clases # class BuilderPizza attr_reader :pizza def create_new_pizza @pizza = Pizza . nuevo fin def get_pizza "Su pedido. pastel: #{ @pizza . pastel } ​​, salsa: #{ @pizza . salsa } , guarnición: #{ @pizza . guarnición } " end end # # BuilderConcret - Constructor de hormigón 1 # class BuilderPizzaHawaii < BuilderPizza def build_pastry @pizza . pastel = final 'normal' definitivamente build_sauce @pizza . salsa = extremo 'suave' definitivamente build_garniture @pizza . guarnición = 'jambon+ananas' end end # # BuilderConcret - Constructor de hormigón 2 # class BuilderPizzaSpicy < BuilderPizza def build_pastry @pizza . pastel = extremo 'hojaldre' definitivamente build_sauce @pizza . salsa = extremo 'picante' definitivamente build_garniture @pizza . guarnición = 'papperoni+salami' end end # # Director: la clase de administrador que inicia la compilación # class Waiter def set_builder_pizza ( bp ) @builder_pizza = bp end definitivamente get_pizza @builder_pizza . get_pizza fin definitivamente construct_pizza @builder_pizza . crear_nueva_pizza @builder_pizza . build_pastry @builder_pizza . build_sauce @builder_pizza . build_garniture final final camarero = camarero . nuevo builder_pizza_hawaii = BuilderPizzaHawái . new builder_pizza_spicy = BuilderPizzaSpicy . nuevo camarero _ set_builder_pizza ( builder_pizza_hawaii ) camarero . construir_pizza pone camarero . conseguir_pizza

Delfos

Texto fuente en Delphi programa BuilderPatternExample ; {$CONSOLA DE TIPO DE APLICACIÓN} utiliza SysUtils ; tipo // Producto TPizza = clase ( TObject ) estricto privado FDough , FSauce , FTopping : string ; public property Dough : string write FDough ; propiedad Salsa : string write FSauce ; propiedad Cobertura : string escribir FTopping ; procedimiento Mostrar ; fin ; // Constructor abstracto TPizzaBuilder = clase ( TObject ) FPizza protegido estricto : TPizza ; propiedad pública Pizza : TPizza leer FPizza ; constructor Crear ; destructor Destruir ; anular ; procedimiento CrearNuevoProductoPizza ; procedimiento ProductoPizzaLibre ; procedimiento ConstruirMasa ; virtuales ; abstracto ; procedimiento BuildSauce ; virtuales ; abstracto ; procedimiento BuildTopping ; virtuales ; abstracto ; fin ; // Constructor de hormigón A THawaiianPizzaBuilder = class ( TPizzaBuilder ) procedimiento público BuildDough ; anular ; procedimiento BuildSauce ; anular ; procedimiento BuildTopping ; anular ; fin ; // Concrete Builder B TSpicyPizzaBuilder = clase ( TPizzaBuilder ) procedimiento público BuildDough ; anular ; procedimiento BuildSauce ; anular ; procedimiento BuildTopping ; anular ; fin ; // Director TWaiter = clase ( TObject ) estricto privado FPizzaBuilder : TPizzaBuilder ; propiedad pública PizzaBuilder : TPizzaBuilder escribir FPizzaBuilder ; constructor Crear ; destructor Destruir ; anular ; procedimiento ConstructPizza ; procedimiento FreePizza ; función ObtenerPizza : TPizza ; fin ; {TPizza} procedimiento TPizza . mostrar ; begin WriteLn ( 'Pizza con masa como ' + FMasa + ', salsa como ' + FSalsa + ' y Cobertura como ' + FCobertura + '!' ) ; fin ; {TPizzaBuilder} constructor TPizzaBuilder . crear ; comenzar FPizza := nil ; fin ; destructor TPizzaBuilder . destruir ; comenzar FreePizzaProduct ; Destruir heredado ; fin ; procedimiento TPizzaBuilder . Producto de pizza gratis ; comenzar si FPizza <> nil entonces FreeAndNil ( FPizza ) ; fin ; procedimiento TPizzaBuilder . CrearNuevoProductoPizza ; comenzar si FPizza <> nil entonces FPizza . Gratis ; FPizza := TPizza . crear ; fin ; {THawaiianPizzaBuilder} procedimiento THawaiianPizzaBuilder . Construir masa ; comenzar si FPizza <> nil entonces FPizza . Masa := 'cruz' ; fin ; procedimiento THawaiianPizzaBuilder . ConstruirSalsa ; comenzar si FPizza <> nil entonces FPizza . Salsa := 'suave' ; fin ; procedimiento THawaiianPizzaBuilder . Construir Topping ; comenzar si FPizza <> nil entonces FPizza . Cobertura := 'jamón y piña' ; fin ; { TSpicyPizzaBuilder } procedimiento TSpicyPizzaBuilder . Construir masa ; comenzar si FPizza <> nil entonces FPizza . Masa := 'pan-horneado' ; fin ; procedimiento TSpicyPizzaBuilder . ConstruirSalsa ; comenzar si FPizza <> nil entonces FPizza . Salsa := 'picante' ; fin ; procedimiento TSpicyPizzaBuilder . Construir Topping ; comenzar si FPizza <> nil entonces FPizza . Cobertura : = 'pepperoni y salami' ; fin ; {TCamarero} constructor TWaiter . crear ; comenzar FPizzaBuilder := nil ; fin ; TWaiter destructor . destruir ; comenzar FPizzaBuilder := nil ; Destruir heredado ; fin ; procedimiento TWaiter . pizza gratis ; comenzar si FPizzaBuilder <> nil entonces FPizzaBuilder . Producto de pizza gratis ; fin ; procedimiento TWaiter . construir pizza ; comenzar si FPizzaBuilder <> nil luego comenzar FPizzaBuilder . CrearNuevoProductoPizza ; FPizzaBuilder . Construir masa ; FPizzaBuilder . ConstruirSalsa ; FPizzaBuilder . Construir Topping ; fin ; fin ; función TWaiter . ObtenerPizza : TPizza ; comenzar si FPizzaBuilder <> nil entonces Resultado := FPizzaBuilder . Pizza más Resultado := nil ; fin ; procedimiento ConstructAndShowPizza ( Camarero : TWaiter ; Constructor : TPizzaBuilder ) ; var Pizza : TPizza ; Comenzar Camarero . ConstructorPizza := Constructor ; camarero _ construir pizza ; Pizza := Camarero . ObtenerPizza ; prueba la pizza . mostrar ; finalmente Camarero . pizza gratis ; fin ; fin ; var Camarero : TWaiter ; constructor de pizza hawaiana : constructor de pizza hawaiana ; SpicyPizzaBuilder : TSpicyPizzaBuilder ; comenzar HawaiianPizzaBuilder := nil ; SpicyPizzaBuilder := nil ; Camarero := nil ; pruebe HawaiianPizzaBuilder := THawaiianPizzaBuilder . crear ; SpicyPizzaBuilder := TSpicyPizzaBuilder . crear ; Camarero := TCamarero . crear ; // El cliente ha pedido dos pizzas ConstructAndShowPizza ( Camarero , HawaiianPizzaBuilder ) ; ConstructAndShowPizza ( Camarero , SpicyPizzaBuilder ) ; finalmente Camarero . Gratis ; Constructor de pizza hawaiana . Gratis ; Constructor de pizza picante . Gratis ; fin ; Leerln ; fin _

VB.NET

Texto fuente en lenguaje VB.NET Importaciones System.Collections.Generic Generador de espacios de nombres Public Class MainApp Public Shared Sub Main () ' Create director and builders Dim director As New Director () Dim b1 Como Constructor = Nuevo ConcreteBuilder1 () Dim b2 Como Constructor = New ConcreteBuilder2 () 'Construir dos productos director . Construya ( b1 ) Dim p1 como Producto = b1 . ObtenerResultado () p1 . Mostrar () directora _ Construya ( b2 ) Dim p2 como Producto = b2 . ObtenerResultado () p2 . Mostrar () 'Esperar a la Consola del usuario . Lectura () End Sub End Class 'Director' Class Director 'Builder utiliza una serie compleja de pasos Public Sub Construct ( constructor ByVal As Builder ) . Constructor BuildPartA () . BuildPartB () End Sub End Class ' "Generador" MustInherit Class Builder Public MustOverride Sub BuildPartA () Public MustOverride Sub BuildPartB () Public MustOverride Función GetResult () As Product End Class ' Clase "ConcreteBuilder1" ConcreteBuilder1 hereda el producto Builder Private ReadOnly como nuevo producto () Public Overrides Sub BuildPartA () producto . Agregar ( "Parte A" ) End Sub Public Overrides Sub BuildPartB () producto . Añadir ( "ParteB" ) End Sub Public Overrides Función GetResult () Como producto Devolver producto End Function End Class ' Clase "ConcreteBuilder2" ConcreteBuilder2 hereda el producto Builder Private ReadOnly como producto nuevo () Public Overrides Sub BuildPartA () producto . Agregar ( "PartX" ) End Sub Public Overrides Sub BuildPartB () producto . Añadir ( "PartY" ) End Sub Public Overrides Función GetResult () Como producto Devolver producto End Function End Class ' Clase "Producto" Producto Privado Partes de solo lectura Como nueva lista ( de cadena )() Public Sub Add ( ByVal part As String ) partes . Añadir ( parte ) End Sub Consola Public Sub Show () . WriteLine ( vbLf & "Partes del producto -------" ) para cada parte como cadena en partes Consola . WriteLine ( parte ) Siguiente Fin Sub Fin Clase Fin Espacio de nombres

Notas

Enlaces