El patrón de construcción es un patrón de diseño diseñado para proporcionar una solución flexible a varios problemas de creación de objetos en la programación orientada a objetos . La intención del patrón de diseño Builder es separar la construcción de un objeto complejo de su representación. Es uno de los patrones de diseño de Gang of Four .
Descripción general
El patrón de diseño Builder es uno de los patrones de diseño GoF [1] que describen cómo resolver problemas de diseño recurrentes en software orientado a objetos.
El patrón de diseño Builder resuelve problemas como: [2]
- ¿Cómo puede una clase (el mismo proceso de construcción) crear diferentes representaciones de un objeto complejo?
- ¿Cómo se puede simplificar una clase que incluye la creación de un objeto complejo?
Crear y ensamblar las partes de un objeto complejo directamente dentro de una clase es inflexible. Compromete a la clase a crear una representación particular del objeto complejo y hace que sea imposible cambiar la representación más adelante independientemente de (sin tener que cambiar) la clase.
El patrón de diseño de Builder describe cómo resolver estos problemas:
- Encapsular la creación y el ensamblaje de las partes de un objeto complejo en un
Builder
objeto separado . - Una clase delega la creación de objetos a un
Builder
objeto en lugar de crear los objetos directamente.
Una clase (el mismo proceso de construcción) puede delegar en diferentes Builder
objetos para crear diferentes representaciones de un objeto complejo.
Definición
La intención del patrón de diseño Builder es separar la construcción de un objeto complejo de su representación. Al hacerlo, el mismo proceso de construcción puede crear diferentes representaciones. [1]
Ventajas
Las ventajas del patrón Builder incluyen: [3]
- Le permite variar la representación interna de un producto.
- Encapsula el código para su construcción y representación.
- Proporciona control sobre los pasos del proceso de construcción.
Desventajas
Las desventajas del patrón Builder incluyen: [3]
- Se debe crear un ConcreteBuilder distinto para cada tipo de producto.
- Las clases de constructor deben ser mutables.
- Puede dificultar / complicar la inyección de dependencia.
Estructura
Diagrama de secuencia y clase UML
En el diagrama de clases de UML anterior , la Director
clase no crea ni ensambla los objetos ProductA1
y ProductB1
directamente. En cambio, se Director
refiere a la Builder
interfaz para construir (crear y ensamblar) las partes de un objeto complejo, lo que lo hace Director
independiente de qué clases concretas se instancian (qué representación se crea). La Builder1
clase implementa la Builder
interfaz creando y ensamblando los objetos ProductA1
y ProductB1
.
El diagrama de secuencia UML muestra las interacciones en tiempo de ejecución: El Director
objeto llama buildPartA()
al Builder1
objeto, que crea y ensambla el ProductA1
objeto. A partir de entonces, las Director
llamadas buildPartB()
sobre Builder1
, lo que crea y monta el ProductB1
objeto.
Diagrama de clase
- Constructor
- Interfaz abstracta para la creación de objetos (producto).
- ConcreteBuilder
- Proporciona implementación para Builder. Es un objeto capaz de construir otros objetos . Construye y ensambla piezas para construir los objetos.
Ejemplos de
Un ejemplo de C # :
/// /// Representa un producto creado por el constructor /// public class Bicycle { public string Make { get ; establecer ; } modelo de cadena pública { get ; establecer ; } public int Height { get ; establecer ; } cadena pública Color { get ; establecer ; } público de bicicletas ( cadena de maquillaje , cadena de modelo , cadena de color , int altura ) { Make = marca ; Modelo = modelo ; Color = color ; Altura = altura ; } }/// /// La abstracción del constructor /// interfaz pública IBicycleBuilder { string Color { get ; establecer ; } int Altura { get ; establecer ; } Bicicleta GetResult (); }/// /// Implementación del constructor de hormigón /// public class GTBuilder : IBicycleBuilder { public string Color { get ; establecer ; } public int Height { get ; establecer ; } public Bicycle GetResult () { return Height == 29 ? Bicicleta nueva ( "GT" , "Avalancha" , Color , Altura ) : nulo ; } } /// /// El director /// public class MountainBikeBuildDirector { private IBicycleBuilder _builder ; public MountainBikeBuildDirector ( constructor de IBicycleBuilder ) { _builder = constructor ; } public void Construct () { _builder . Color = "Rojo" ; _builder . Altura = 29 ; } }público de clase de cliente { públicos vacíos DoSomethingWithBicycles () { var constructor = nueva GTBuilder (); var director = new MountainBikeBuildDirector ( constructor ); director . Construir (); Bicicleta myMountainBike = constructor . GetResult (); } }
El Director ensambla una instancia de bicicleta en el ejemplo anterior, delegando la construcción a un objeto de construcción separado que el Cliente le ha dado al Director.
Ver también
Referencias
- ↑ a b Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Patrones de diseño: elementos de software orientado a objetos reutilizable . Addison Wesley. págs. 97 y siguientes . ISBN 0-201-63361-2.CS1 maint: varios nombres: lista de autores ( enlace )
- ^ "El patrón de diseño del constructor: problema, solución y aplicabilidad" . w3sDesign.com . Consultado el 13 de agosto de 2017 .
- ^ a b "Índice de / archivo / 2010 / invierno / 51023-1 / presentaciones" (PDF) . www.classes.cs.uchicago.edu . Consultado el 3 de marzo de 2016 .
- ^ "El patrón de diseño Builder - Estructura y colaboración" . w3sDesign.com . Consultado el 12 de agosto de 2017 .
enlaces externos
- El artículo de JavaWorld Construye interfaces de usuario sin captadores y definidores ( Allen Holub ) muestra el código fuente completo de Java para un constructor.