Patrón Builder
El patrón Builder es un patrón de diseño creacional que te permite separar los pasos de creación de un objeto complejo de su representación.
El patrón Builder es un patrón de diseño creacional cuyo objetivo principal es separar el proceso de construcción de un objeto complejo de su representación, lo que permite crear objetos con diferentes formas de representación.
Resumen
Intención
Separar un proceso de construcción complejo de su representación, de modo que el mismo proceso de construcción pueda crear diferentes representaciones.
Problema principal
En los sistemas de software, la creación de un objeto complejo suele constar de múltiples partes; la combinación de estas partes cambia a menudo, pero el algoritmo de combinación es relativamente estable.
Cuándo usarlo
Cuando algunos componentes básicos no cambian, pero su combinación cambia con frecuencia.
Cómo resolverlo
Separar las partes variables de las invariables.
Código clave
- Constructor: crea y proporciona instancias.
- Director: gestiona las dependencias de las instancias construidas y controla el proceso de construcción.
Ejemplos de aplicación
- Ir a KFC: la hamburguesa, la Coca-Cola, las papas fritas, las alitas de pollo frito, etc. no cambian, pero su combinación cambia con frecuencia, generando diferentes “combos”.
- En Java
StringBuilder。
Ventajas
- Separa el proceso de construcción de la representación, lo que hace que el proceso de construcción sea más flexible y pueda construir diferentes representaciones.
- Permite un mejor control del proceso de construcción y oculta los detalles concretos de construcción.
- Alta reutilización del código: se puede reutilizar el mismo constructor en diferentes procesos de construcción.
Desventajas
- Si el producto tiene pocas propiedades, el patrón Builder puede provocar redundancia de código.
- Aumenta el número de clases y objetos del sistema.
Escenarios de uso
- Cuando el objeto que se debe generar tiene una estructura interna compleja.
- Cuando los atributos internos del objeto que se debe generar son interdependientes.
Notas
La diferencia con el patrón de fábrica es que el patrón Builder se centra más en el orden de ensamblaje de las piezas.
Estructura
El patrón Builder incluye los siguientes roles principales:
Producto (Product): el objeto complejo que se va a construir. La clase de producto normalmente contiene múltiples partes o atributos.
Constructor abstracto (Builder): define la interfaz abstracta para construir el producto, incluyendo los métodos para construir cada una de sus partes.
Constructor concreto (Concrete Builder): implementa la interfaz del constructor abstracto, determina concretamente cómo construir cada parte del producto y se encarga de devolver el producto finalmente construido.
Director (Director): se encarga de llamar a los métodos del constructor para construir el producto; el director no conoce el proceso de construcción específico, solo le importa el orden y la forma de construcción del producto.
Implementación
Supongamos un caso de negocio de una tienda de comida rápida, donde un combo típico puede ser una hamburguesa (Burger) y una bebida fría (Cold drink). La hamburguesa puede ser vegetariana (Veg Burger) o de pollo (Chicken Burger), y se envuelven en una caja de cartón. La bebida fría puede ser Coca-Cola (coke) o Pepsi (pepsi), y se sirven en botella.
Vamos a crear unaIteminterfaz e implementaciónItemde las clases de entidad de la interfaz, y una que represente el empaque de alimentosPackinginterfaz e implementaciónPackingde las clases de entidad de la interfaz. La hamburguesa se envuelve en una caja de cartón y la bebida fría se sirve en botella.
Luego creamos unaMealclase, conItemdeArrayListy una mediante la combinación deItempara crear diferentes tipos deMealobjetosMealBuilder。BuilderPatternDemola clase usaMealBuilderpara crear unMeal。
Paso 1
Cree una interfaz que represente los artículos de comida y el empaque de alimentos.
Item.java
Packing.java
Paso 2
Cree clases de entidad que implementen la interfaz Packing.
Wrapper.java
Bottle.java
Paso 3
Cree una clase abstracta que implemente la interfaz Item; esta clase proporciona funcionalidad predeterminada.
Burger.java
ColdDrink.java
Paso 4
Cree clases de entidad que extiendan Burger y ColdDrink.
VegBurger.java
ChickenBurger.java
Coke.java
Pepsi.java
Paso 5
Cree una clase Meal con los objetos Item definidos anteriormente.
Meal.java
Paso 6
Cree una clase MealBuilder; la clase builder real es la responsable de crear objetos Meal.
MealBuilder.java
Paso 7
BuiderPatternDemo usa MealBuilder para demostrar el patrón Builder.
BuilderPatternDemo.java
Paso 8
Ejecute el programa y observe el resultado:
Veg Meal Item : Veg Burger, Packing : Wrapper, Price : 25.0 Item : Coke, Packing : Bottle, Price : 30.0 Total Cost: 55.0 Non-Veg Meal Item : Chicken Burger, Packing : Wrapper, Price : 50.5 Item : Pepsi, Packing : Bottle, Price : 35.0 Total Cost: 85.5