Factory Method

Factory Method
Información sobre la plantilla
Factory Method.png
Concepto:Define una interfaz para crear objetos pero deja que sean las subclases las que deciden qué clases instanciar.

Factory Method: es un patrón de diseño que define una interfaz para crear un objeto, pero deja que sean las subclases quienes decidan qué clase instanciar. Permite que una clase delegue en sus subclases la creación de objetos.

El patrón Factory Method permite escribir aplicaciones que son más flexibles respecto de los tipos a utilizar difiriendo la creación de las instancias en el sistema a subclases que pueden ser extendidas a medida que evoluciona el sistema. Permite también encapsular el conocimiento referente a la creación de objetos. Factory Method hace también que el diseño sea más adaptable a cambio de sólo un poco más de complejidad. Se utiliza frecuentemente con Template Method. En la sección de ejemplos de código de este patrón presentaremos una implementación de este caso.

Uno de los principales inconvenientes que puede presentar este patrón es que puede requerir crear una nueva clase simplemente para cambiar la clase de Producto.


Tipo

Creación, a nivel de clases.


Propósito

Definir una interfaz para la creación de un objeto, pero permitiendo a las subclases decidir de que clase instanciarlo. Permite, por tanto, que una clase difiera la instanciación en favor de sus subclases.


Participantes

  • Producto: Define la interfaz de los objetos que crea el método de fabricación.
  • ProductoConcreto: Implementa la interfaz Producto.
  • Creador: Declara el método de fabricación, el cual devuelve un objeto del tipo Producto. También puede definir una implementación predeterminada del método de fabricación que devuelve un objeto ProductoConcreto. Puede llamar al método de fabricación para crear un objeto Producto.
  • CreadorConcreto: Redefine el método de fabricación para devolver una instancia de ProductoConcreto.


Debe usarse

  • Cuando una clase no puede adelantar las clases de objetos que debe crear.
  • Cuando una clase pretende que sus subclases especifiquen los objetos que ella crea.
  • Cuando una clase delega su responsabilidad hacia una de entre varias subclases auxiliares y queremos tener localizada a la subclase delegada.


Ventajas e inconvenientes

Ventajas

  • Se gana en flexibilidad, pues crear los objetos dentro de una clase con un "Método de Fábrica" es siempre más flexible que hacerlo directamente, debido a que se elimina la necesidad de atar nuestra aplicación unas clases de productos concretos.
  • Se facilitan futuras ampliaciones, puesto que se ofrece las subclases la posibilidad de proporcionar una versión extendida de un objeto, con sólo aplicar en los Productos la misma idea del "Método de Fábrica".
  • Se facilita, en cuanto a que se hace natural, la conexión entre jerarquías de clases paralelas, que son aquellas que se generan cuando una clase delega algunas de sus responsabilidades en una clase aparte. Ambas jerarquías de clases paralelas son creadas por un mismo cliente y el patrón Método de Fábrica establece la relación entre parejas de subclases concretas en las mismas.

Inconvenientes

  • Se obliga al cliente a definir subclases de la clase "Creador" sólo para crear un producto concreto y esto puede no ser apropiado siempre.


Dónde usar los beneficios

  • Conecte las jerarquías de las clases paralelas.
  • Una clase quiere su subclase para especificar el objeto.
  • Una clase no puede anticiparse su subclase que debe crearse.
  • Una familia de necesidades de los objetos ser separado usando la interfaz compartido.
  • El código necesita tratar con la interfaz, las clases llevadas a cabo.
  • Esconda las clases concretas del cliente.
  • El objeto vuelto puede ser el objeto abstracto o concreto.
  • Los ganchos proporcionando para las subclases son más flexibles que creando los objetos directamente.
  • Siga las convenciones de la denominación para ayudar que otros diseñadores reconocer la estructura del código.
  • Los modelos relacionados incluyen
  • Fábrica abstracta que es superior una capa que un método de la fábrica.
  • Método de la plantilla que define un esqueleto de un algoritmo para diferir algunos pasos de subclases o evitar las subclases
  • Prototipo que crea un nuevo objeto copiando un caso para que reduce las subclases.


Relacionado con

  • Fábrica Abstracta es frecuentemente implementado con el Método de Fábrica.
  • Método de Fábrica habitualmente se utiliza dentro del Método Plantilla.
  • Prototipo no requiere hacer subclases de "Creador", pero sí una operación de "Inicializar" en la clase "Producto", que no le hace falta a Método de Fábrica.


Otros aspectos de interés

  • El "Método Fábrica" puede ser algo más que una mera declaración del método, puede tener una implementación genérica, por defecto. En C++, es un método virtual, generalmente puro.
  • Parametrizando el "Método Fábrica" con el tipo del producto a crear nos ahorramos las subclases de "Creador" (también se pueden usar templates, en C++).
  • La filosofía que sigue el "Creador" es de iniciación perezosa, ya que, al acceder al producto, si no existe todavía, se crea.


Ejemplo de aplicación

En un "marco de referencia" para aplicaciones que pueden presentar múltiples documentos al usuario, no se sabe, a priori, los tipos de documentos con los que va a trabajar cada aplicación concreta. El "marco de referencia" debe, por tanto, instanciar clases, pero sólo tiene conocimiento de las clases abstractas, las cuales no pueden ser instanciadas. La solución está en hacer que CrearDocumento() sea un Método de Fábrica que se encargue de la "fabricación" del objeto oportuno en cada situación (es una operación abstracta en la clase abstracta, pero concreta y distinta en las subclases correspondientes a cada tipo de aplicación.


Fuentes