Abstracción de datos (IV): El patrón Abstract Factory (Factoría Abstracta)


Anteriormente vimos lo que era una interfaz y cómo implementarla en C#. Hoy aprovecharemos estos conocimientos para explicar otro patrón de diseño: la Factoría Abstracta o Abstract Factory.

El patrón Abstract Factory es un patrón “familiar”. ¿Por qué familiar? Porque está especializado en proporcionar instancias de familias de objetos. Imaginemos la siguiente situación:

Abstract Factory

Como vemos, tenemos una clase FactoriaAbstracta. Como su nombre indica, se trata de una fábrica. Una fabrica de fábricas. Conceptualmente, la imaginaremos como la “Empresa Matriz” que es capaz de proporcionarnos aquello que necesitamos. Imaginemos que se trata, por ejemplo, de Motores Unidos S.L.

Motores Unidos S.L. posee varias fábricas, cada una de ellas especializada en un componente en concreto. Posee fábricas de motores Gasolina, Diesel y de Hidrógeno. Por lo tanto, lo que estas factorías fabricarán será precisamente eso: motores. vemos que el método crearMotor() es heredado desde FactoriaAbstracta. Como hemos dicho, Motores Unidos S.L. fabrica motores. De muchos tipos. Será cuestión de cada fábrica en concreto organizar la cadena de montaje adecuada para entregarle al cliente lo que pide: un motor.

Ahora nos vamos al otro lado: un motor de gasolina, uno diesel y uno de hidrógeno tienen el mismo propósito: proporcionar energía a la transmisión de un vehículo. Al vehículo no le importa cómo se produce esa energía (es cuestión de cada uno de los motores). Símplemente se conectará y esperará recibir energía del motor. Si recordamos nuestra introducción a las interfaces, ese era el objetivo: a través de un “punto de conexión”, la pieza se ensambla con el resto de los elementos sin que éstos necesiten saber cómo funciona por dentro: con que posea capacidad de arranque, parada y suministre energía, será más que suficiente.

Así pues, un motor puede ser de varios tipos (Gasolina, Diesel, Hidrógeno…). Cada uno de ellos es fabricado en una factoría distinta (FactoriaGasolina, FactoriaDiesel, FactoriaHidrogeno…), pero todos tienen algo en común: son motores. Por lo tanto, las factorías concretas implementarán internamente los motores como Gasolina, Diesel o Hidrógeno, pero los “venderán” como motores a secas.

Abstract Factory (II)

Así pues, los vehículos montarán motores. Si quisiéramos implementar un motor gasolina en un Turismo, procederíamos a realizar el siguiente proceso:

  • Nos dirigiríamos a Motores Unidos S.L. para preguntarle dónde obtener un motor de Gasolina. La empresa nos remitiría a la fábrica de motores de Gasolina de Navarra, que se encarga de fabricar ese modelo en concreto.
  • Construiríamos el resto del vehículo, dejando espacio y los conectores adecuados para que encaje un motor de Motores Unidos S.L.
  • Acudiríamos a la factoría de Navarra, una FactoriaGasolina y le pediríamos un motor. No es necesario decirle de que tipo es, ya que la fábrica únicamente proporciona a sus clientes motores Gasolina. No obstante, nuestro coche estará preparado para soportar cualquier tipo de motor.
  • Para arrancar el vehículo, este llamará a la función Arrancar(). El motor se encargará del resto.

En un lenguaje más formal, haríamos lo siguiente:

  • Crearíamos una referencia de tipo MotorAbstracto.
  • Crearíamos una instancia de FactoriaGasolina.
  • Invocaríamos el método FactoriaGasolina.crearMotor(), que nos devolvería un MotorGasolina en nuestra referencia de MotorAbstracto.

En breve mostraremos cómo aplicar esta filosofía de forma práctica.

Anuncios

4 comments

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s