miércoles, 4 de mayo de 2016

Patrón Método Fábrica

PATRÓN FACTORY METHOD/MÉTODO FÁBRICA

¿CUAL ES EL PROPÓSITO? 

Permitir que una clase delegue la responsabilidad de la creación de objetos a sus subclases.


¿QUÉ MOTIVA A IMPLEMENTAR ESTE PATRÓN?


En el desarrollo de aplicaciones es común encontrarse con la creación de objetos que, aunque bien son diferentes, tienen algo en común, pertenecen a una misma familia por decirlo de alguna manera, un ejemplo de esto es la creación de documentos.  

Una clase Gaveta que hace parte de una clase Archivo, cuya responsabilidad es almacenar los documentos en una aplicación, necesitará crear instancias de algún tipo de documento especifico. Por ejemplo, se pueden crear documentos en Word, Hojas de calculo, PDF, etc vease la figura 1
Debido a que las subclases Documentos concretas para instanciar son especificas de su aplicación, la clase Gaveta no puede predecir qué subclase de Documento debe instanciar, es decir, la clase Gaveta solo sabe cuándo debe crearse un nuevo Documento, pero no qué tipo de Documento crear.



figura 1.

Este método propone una solución a este dilema.  Encapsula el conocimiento acerca de qué subclase de Documento crear y saca ese conocimiento fuera de la clase.

Las subclases de Archivo re definen su operación abstracta crearDocumento para que devuelva la subclase de Documento adecuada. llamaremos a este método crearDocumento un método de fabricación porque es el responsable de "fabricar" un objeto.


IMPLEMENTACIÓN

A la hora de aplicar debemos tener en cuenta dos cuestiones:


  1. pueden usarse métodos de fabricación parametrizados. es una variante de este patrón que permite que los métodos en los que se implementa la fabricación creen varios tipos de productos, en nuestro caso de Documento.
  2. cuando la clase creador, Gaveta para nuestro caso, es una clase concreta, es decir que no tiene subclases, y proporciona una implementación predeterminada del método de fabricación.  Para ser mas claros, es crear solo una clase Gaveta y que ella misma sea quien se encargue de crear los tipos de documentos según la lógica implementada por defecto en el método de fabricación, crearDocumento para nuestro caso.
  3. otra variante es cuando la clase creador, Gaveta para nuestro caso, es una clase abstracta y no proporciona una implementación para el método de fabricación que declara.
para ilustrar mejor estas tres variantes especifiquemos el problema de las gavetas del archivo.  Suponga que la clase Gaveta puede crear cualquier tipo de documento, por lo que para resolver este problema usando el método de fabricación, se hará uso de la primera variante descrita anteriormente, en donde se puede crear un método de fabricación parametrizado que reciba la extensión del documento y cree, ya sea, un Documento pdf si es .pdf, o Word si es .Doc, etc. vease la figura 1.1



figura 1.1

Ahora suponga que se pide que hayan diferentes restricciones, en donde  una gaveta deba contener un conjunto de documentos específicos, de oficio, o Pdf, entonces nuestra clase Gaveta seria abstracta y habría una subclase GavetaOficios y otra GavetaDigitalizados donde solo se crearán documentos Word y Pdf, respectivamente, para archivar, por lo que el método crearDocumento será abstracto y su implementación estará en la subclase Correspondiente, esto nos evita tener que instanciar objetos de tipo Documento Word o Pdf como caso especifico.  Solo cuando se cree una instancia de Gaveta tipo GavetaOficios o GavetaDigitalizados podremos crear Documentos Word o Pdf, llamando su método de fabricación crearDocumento. vease la figura 1.2

figura 1.2

La primera y segunda variante son muy parecidas, por lo que solo se desarrollará el código de la ultima.  Por otra parte, a modo de aprendizaje se dejará la implementación de la primera variante como ejercicio, será fácil, solo se debe desarrollar en la lógica del método fábrica  devolver una instancia según la extensión recibida.

Ahora si, vamos al código.  Empezamos creando la clase abstracta Gaveta.
Luego creamos las subclases GavetaDigitalizados y GavetaOficios, respectivamente.
Ahora Crearemos la Interfaz Documento y los tipos de documento Word y Pdf respectivamente.
Por ultimo creamos la clase Archive que tendrá un listado de gavetas creadas por defecto.
El siguiente código, es la implementación en main.

0 comentarios:

Publicar un comentario