Abstract Factory (Fábrica abstracta -GoF)

Documentos relacionados
Tutorial de C# Delegados y Eventos. Por: Óscar López, M.Sc.

12. Tipos de atributos

Idiom SimpleFactory Factory Method Abstract Factory Conclusiones

Java: Clases Abstractas e Interfaces

Patrón Fábrica Abstracta. Julio Ariel Hurtado Alegría Ingeniería de Software II 2015

Tema 6 Patrones de Diseño. Programación Orientada a Objetos Curso 2010/2011

18. Interfaces Declaración de una interfaz

Java: Clases Abstractas e Interfaces

Clases y herencia. FJP Unidad 8. Diseño de clases

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Ejemplo (incompleto) de desarrollo de una aplicación en Java

Clases y Objetos en C++

Clases Abstractas e Interfaces

Tema 6: Clases. Índice

Introducción: una simple colección

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

PATRONES DE DISEÑO DE CREACIÓN. Abstract Factory Builder Factory Method Prototype

Patrones GoF. of four) 23 patrones presentados por la pandilla de los cuatro en el libro Design Patterns.. Gamma, Helm, Johnson, Vlissides

Concurso: Cuánto sabes de JAVA?

Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

Programación Dirigida a Objetos. MATERIAL COMPLEMENTARIO Tema 5.- Herencia

// Método Comunicarse, sera implementado por las clases concretas que hereden de la clase //animal

Diseño Basado en Componentes. Curso 2008 / 09

Derechos de Acceso: COMPOSICION

A3F. Polimorfismo. Carlos Fontela

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

Ejecución de hebras. En realidad, todas las aplicaciones escritas en Java son aplicaciones multihebra (recuerde el recolector de basura).

o Una clase es un tipo al cual pertenecen objetos o instancias de la clase.

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote MODIFICADORES DE ACCESO A LOS MIEMBROS DE UNA CLASE

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

Patrones de Diseño. Patrón estructural Proxy. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

o Una clase en Java se compone de: o A los anteriores se les conoce también como miembros de la clase.

Definición. Mónica E. García García Feb 07

Universidad de Cantabria

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Ejercicio 3 Proyecto Intérprete Curso de Spring Framework

Programación orientada a objetos

Unidad Didáctica 1. Introducción a la Programación Orientada a Objetos (POO) Conceptos de clase, objeto e interfaz. Atributos y métodos

Estructuras de control selectivas

Arquitecturas cliente/servidor

Polimorfismo Java y Servicios Web I Master en Ingeniería Matemática

PROGRAMACIÓN GENÉRICA

Práctica 5. Fecha límite de entrega: viernes, 14 de diciembre

Taller de Programación I. Tema 10: Herencia en Java

Interfaces. Amparo López Gaona. Septiembre de Amparo López Gaona () Interfaces Septiembre de / 1

o Los arreglos son colecciones ordenadas de datos del mismo tipo. o Ejemplos: 2

Ejercicio 1 (proyecto prlistas, paquete listas)

Patrones de Diseño. Patrones de creación. Técnicas de Programación - Curso 2007/08

PHP5 Orientado a Objetos

EJERCICIO Y EJEMPLO RESUELTO: USO DE LA INTERFAZ CLONEABLE DE JAVA. MÉTODO CLONE() PARA CLONAR OBJETOS. (CU00912C)

CONCEPTO DE INTERFACE Y HERENCIA MÚLTIPLE EN JAVA. IMPLEMENTS. EJEMPLOS Y DIAGRAMAS DE CLASES. (CU00696B)

Introducción y conceptos de POO

Ingeniería del Software Separación entre Presentación y Lógica del Negocio

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Guía práctica de estudio 08: Polimorfismo

El patrón Composite (Compuesto) Propósito Componer los objetos a una estructura de jerarquía de relación partetodo.

Examen Teórico Convocatoria de Junio de 2012

Programación orientada a objetos. Resumen de Temas Unidad 6: Polimorfismo y reutilización

Construcciones del Lenguaje Java

Los Constructores(1)

INTERFACE ITERATOR DEL API JAVA. MÉTODO REMOVE PARA BORRAR OBJETOS EN COLECCIONES. EJERCICIOS Y EJEMPLO RESUELTO. (CU00919C)

Patrones de Diseño. Patrón de comportamiento Iterator. Técnicas de programación - Curso 2008/09 (Esther Guerra Sánchez)

Programación Orientada a Objetos en C#.NET CAPÍTULO 8 DELEGADOS. Ing. Bruno López Takeyas, M.C.

Java Avanzado Facultad de Ingeniería. Escuela de computación.

PNFSI. Asignatura: Desarrollo de Software. Tema 1: Programación Orientada a Objetos

Threads o Hilos. Un thread en JAVA comienza como una instancia de java.lang.thread antes de convertirse en un hilo de ejecución.

SOFTWARE Microsoft Visual Studio 2005.NET FrameWork 2.0

Tema 10: Interfaces. Índice

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Herencia y Polimorfismo

Patrones de Diseño. Patrón estructural Composite. Técnicas de Programación - Curso 2007/08

Introducción. Introducción y conceptos de POO. En qué consiste la POO? Vocabulario. Definiciones

Java Básico. Polimorfismo. Copyright

En Java, un arreglo es un grupo de variables (llamados elementos o componentes) que contienen valores, todos del mismo tipo.

2º Parcial. Bloque I. Preguntas cortas LPOO (C++, C#, Java) Nombre: DNI: Titulación:

Patrones de Diseño. Patrón de comportamiento Iterator. Técnicas de Programación - Curso 2007/08

Tema: Funciones Virtuales y Polimorfismo.

Tema: Funciones Virtuales y Polimorfismo.

Algoritmos y Estructuras de Datos Iteradores. Guillermo Román Díez

Curso de Java orientado a Android Parte 2

FACULTAD DE INGENIERÍA

INTERFACE LIST DEL API JAVA. CLASES ARRAYLIST, LINKEDLIST, STACK, VECTOR. EJEMPLO CON ARRAYLIST. (CU00920C)

Eventos. Nota: Los eventos poseen las siguientes características:

Conceptos Básicos. Programación Orientada a Objetos 2

Programación orientada a Objetos (POO) La POO está compuesta por una serie de elementos que se detallan a continuación.

IMPLEMENTACIÓN DE CONCEPTOS P.O.O. EN JAVA

Interfaces y Clases Internas

ALGORITMICA Y PROGRAMACION POR OBJETOS I

Pasos requeridos para establecer el manejo de eventos para un componente de GUI.

int[] nombrearray1; int nombrearray2[];

Clases y métodos parciales (Guía de programación de C#)

LA CLASE VECTOR DEL API JAVA. MÉTODOS TRIMTOSIZE Y ENSURECAPACITY EJEMPLO Y EJERCICIOS RESUELTOS. (CU00922C)

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

Patrones de Diseño. Ing. Miguel Angel Cedeño Garcidueñas

Diseño y Programación Orientados a Objetos 29 de Abril de Primer Certamen

EXAMEN PROGRAMACIÓN 21 de Septiembre de 2007 INGENIERÍA INFORMÁTICA Primera parte: Cuestiones 1,5 horas

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Implementación de clientes con CORBA y Java

POO en Java IV: Herencia (Parte 1)

16. Herencia Definición de herencia. 168 A. García-Beltrán y J.M. Arranz

Transcripción:

Franco Guidi Polanco 1 Abstract Factory (Fábrica abstracta -GoF) Descripción Presenta una interfaz para la creación de familias de productos, de forma tal que el cliente que las utiliza no requiera conocer las clases concretas que la componen. Esto fuerza al cliente a crear solamente productos relacionados entre si, a la vez que lo habilita para la utilización de distintas familias de productos. Ejemplo Un negocio de venta de equipos musicales efectúa demostraciones del uso de sus distintos productos. Los productos se agrupan en familias según la tecnología en la que se basan, como por ejemplo la familia de equipos que utilizan compact disc (CD), o la familia de equipos basados en cinta magnética. Independientemente del caso, se supondrá que cada familia está compuesta por un medio en que se registra la música, un dispositivo que realiza el registro en el respectivo medio, y otro que la reproduce (ver Fig x.1). Grabador CD Reproductor Grabador Cinta magnética Reproductor Fig. x.1 Si estos productos ofrecieran a sus usuarios la misma interfaz, un cliente podría realizar el mismo proceso de prueba de productos en cualquiera de las familias. Por ejemplo, podría registrar una canción utilizando el dispositivo de grabación, para luego escucharlo en el dispositivo de reproducción. Sólo deberíamos asegurarnos que los productos sean compatibles entre si, esto es, que todos ellos pertenezcan a una misma familia. El problema consiste en la definición de un mecanismo que permita al cliente crear y utilizar familias completas de productos, sin tener conocimiento de cuáles son los integrantes concretos de la familia. Descripción de la solución ofrecida por el patrón de diseño La definición de interfaces constituye el mecanismo mediante el cual es posible ocultar la implementación de una clase en aquellas porciones de código en que son utilizadas. En consecuencia, la definición de interfaces comunes para aquellos productos análogos pertenecientes a diferentes familias, permitirá a un mismo cliente realizar operaciones similares sobre artefactos de tecnologías distintas. El problema surge cuando el cliente debe manejar familias cuyos productos no deben entremezclarse. Por ejemplo,

Franco Guidi Polanco 2 si se pretende utilizar un grabador de CD el cliente debe instanciarlo junto con un CD y un reproductor de CD, no con una cinta magnética o un reproductor de DVD. La sola definición de interfaces para los productos no garantiza que el cliente se limite a crear sólo productos de una misma familia. El patrón de diseño Abstract Factory resuelve este problema por medio de la encapsulación de reglas de instanciación. Ésta permite ocultar en una clase fábrica el proceso de instanciación de un conjunto de productos. Por su parte, la encapsulación de los productos tras interfaces comunes permitirá al cliente utilizar productos análogos pertenecientes a familias diferentes. Los neófitos en el campo de los patrones de diseño suelen cuestionarse la diferencia entre este patrón y el Factory Method, puesto que ambos presentan una estructura similar, al encapsular en una clase el proceso de instanciación de un objeto. La diferencia radica en que, mientras el Factory Method tiene por objetivo diferir hacia una determinada clase (o subclase) el tipo de producto a instanciar, el patrón Abstract Factory persigue garantizar la creación de un conjunto de productos relacionados. La implementación de este patrón requiere definición de una interfaz adicional a la de los productos: la interfaz que implementarán las fábricas encargadas de generarlos, y que permitirá al cliente interactuar con ellas. Esta interfaz proveerá los métodos cuyo contrato consistirá en retornar instancias de cada tipo de producto dentro de una familia. En el caso del ejemplo, la interfaz de las fábricas permitirá al cliente solicitar la generación de instancias de grabador, de medios de registro y de reproductores. De esta forma, el cliente no deberá invocar en caso alguno el constructor de los productos, quedando absolutamente desligado de la implementación particular de estos últimos. Estructura del patrón de diseño Client AbstractFactory {abstract AbstractProduct {abstract +createproduct() : AbstractProduct {abstract ConcreteFactory <<instantiates>> produces ConcreteProduct +createproduct() : AbstractProduct #ConcreteProduct() Fig. x.2

Franco Guidi Polanco 3 Aplicación de patrón de diseño Esquema DevicesFactory + createplayer() : Player + createrecorder() : Recorder + createmedia() : Media Client Media CD Devices Factory Tape Devices Factory Tape + saveontape(string sound) + readtape() : String CD + writeondisk(string sound) + readdisk() : String Recorder + accept(media) + record() Tape Recorder CD Recorder Player + ac cept(media) + play() Tape Player CD Player Fig. x.3 Participantes AbstractFactory (Fábrica Abstracta): interfaz DevicesFactory. - Declara una interfaz para las operaciones que crean y restituyen productos. - En la declaración de cada método, los productos restituidos son del tipo AbstractProduct. ConcreteFactory (Fábrica concreta): classes TapeDevicesFactory y CDDevicesFactory. - Cada una de estas clases Implementa la interfaz de la AbstractFactory (DevicesFactory), especificando las operaciones que crean y retornan objetos correspondientes a productos específicos (ConcreteProduct). AbstractProduct: interfaces Media, Recorder y Player. - Declaran las operaciones que caracterizan a los distintos tipos genéricos de productos. ConcreteProduct: clases Tape, TapeRecorder, TapePlayer, CD, CDRecorder y CDPlayer. - Definen los productos creados por cada ConcreteFactory.

Franco Guidi Polanco 4 Client: clase Client. - Utiliza la interfaz de la AbstractFactory (DevicesFactory) para acceder a los métodos de la ConcreteFactory correspondiente a una familia de productos. - Utiliza los productos a través de su interfaz AbstractProduct. Descripción del código En primer lugar, se definen las interfaces de las clases que deberán implementar los productos análogos pertenecientes a las distintas familias. En el caso de este ejemplo, Media es la interfaz que implementan los soportes de grabación. Particularmente esta interfaz no especifica métodos, sólo actúa como una interfaz para marcar su rol. Por su parte, las interfaces Player y Recorder definen las interfaces de reproductores y grabadores, especificando los distintos métodos con los cuales el cliente interactuará con ellas. public interface Media { public interface Player { public void accept( Media med ); public void play( ); public interface Recorder { public void accept( Media med ); public void record( String sound ); Los productos de las distintas familias implementan las interfaces definidas anteriormente. En el caso de la familia de productos basada en el casete, los productos son Tape, TapeRecorder y TapePlayer: public class Tape implements Media { private String tape= ""; public void saveontape( String sound ) { tape = sound; public String readtape( ) { return tape; public class TapeRecorder implements Recorder { Tape tapeinside; tapeinside = (Tape) med; public void record( String sound ) { if( tapeinside == null ) System.out.println( "Error: Insert a tape." ); tapeinside.saveontape( sound );

Franco Guidi Polanco 5 public class TapePlayer implements Player { Tape tapeinside; tapeinside = (Tape) med; public void play( ) { if( tapeinside == null ) System.out.println( "Error: Insert a tape." ); System.out.println( tapeinside.readtape() ); Por su parte, los productos pertenecientes a la familia del CD son: public class CD implements Media{ private String track = ""; public void writeondisk( String sound ) { track = sound; public String readdisk( ) { return track; public class CDRecorder implements Recorder { CD cdinside; cdinside = (CD) med; public void record( String sound ) { if( cdinside == null ) System.out.println( "Error: No CD." ); cdinside.writeondisk( sound ); public class CDPlayer implements Player { CD cdinside; cdinside = (CD) med; public void play( ) { if( cdinside == null ) System.out.println( "Error: No CD." ); System.out.println( cdinside.readdisk() ); La interfaz DevicesFactory declara los métodos que utilizará el cliente para interactuar con las fabricas de productos. Nótese que cada método tiene la función de crear un tipo de producto específico: public interface DevicesFactory {

Franco Guidi Polanco 6 public Player createplayer(); public Recorder createrecorder(); public Media createmedia(); Las clases TapeDevicesFactory y CDDevicesFactory corresponden a las fábricas de productos de las diferentes familias. Estas clases corresponden a las Concrete- Factory para la creación de productos correspondientes a las familias basadas en casete en CD, respectivamente. public class TapeDevicesFactory implements DevicesFactory { public Player createplayer() { return new TapePlayer(); public Recorder createrecorder() { return new TapeRecorder(); public Media createmedia() { return new Tape(); public class CDDevicesFactory implements DevicesFactory { public Player createplayer() { return new CDPlayer(); public Recorder createrecorder() { return new CDRecorder(); public Media createmedia() { return new CD(); La clase Client es la que finalmente solicita la instanciación de los productos, y los utiliza. El Client accede tanto a la fábrica de productos, como a los productos mismos a través de sus interfaces comunes. Esto permite al Client utilizar tanto los productos basados en casete, como aquellos basados en CD (como también, cualquier otra familia que adhiera a las interfaces ya declaradas). El Client de este ejemplo implementa el método selecttechnology recibe una instancia de fábrica, la cual es utilizada en el interior del método test para crear los productos y utilizarlos. Se debe notar que la clase Client crea y utiliza los productos sin tener conocimiento acerca de qué tipo específico de producto está usando. class Client { DevicesFactory technology; public void selecttechnology( DevicesFactory df ) { technology = df; public void test(string song) { Media media = technology.createmedia(); Recorder recorder = technology.createrecorder(); Player player = technology.createplayer(); recorder.accept( media ); System.out.println( "Recording the song : " + song ); recorder.record( song ); System.out.println( "Listening the record:" );

Franco Guidi Polanco 7 player.accept( media ); player.play(); Finalmente se presenta la aplicación que crea una instancia de Client, y le asigna las distintas fábricas de productos para su utilización. public class AbstractFactoryExample { public static void main ( String[] arg ) { Client client = new Client(); System.out.println( **Testing tape devices ); client.selecttechnology( new TapeDevicesFactory() ); client.test( "I wanna hold your hand..." ); System.out.println( **Testing CD devices ); client.selecttechnology( new CDDevicesFactory() ); client.test( "Fly me to the moon..." ); Observaciones respecto del ejemplo En este ejemplo se ha querido destacar la necesidad de que el cliente deba crear sólo productos de una misma familia. En particular se debe notar que los métodos que ofrece la clase CD y la clase Tape, y que son utilizados por los respectivos grabadores y reproductores, son distintos. Este hecho, resulta irrelevante al momento de crear los productos, pues la consistencia de la creación de objetos es garantizada por la clase fábrica. Ejecución del ejemplo C:\Patterns\Creational\Abstract Factory\>java AbstractFactoryExample **Testing tape devices Recording the song : I wanna hold your hand... Listening the record: I wanna hold your hand... **Testing CD devices Recording the song : Fly me to the moon... Listening the record: Fly me to the moon... Observaciones sobre el patrón Debido a que, tanto la AbstractFactory, como los AbstractProduct de este ejemplo no implementan operaciones, en Java resulta más adecuado codificarlos como interfaces, en vez de clases abstractas, como se sugiere en [Gamma]. Otros ejemplos Una compañía que produce videojuegos está interesada en crear un juego en el cual el usuario debe escoger un personaje que lo representará a lo largo de una aventura, junto con ciertas herramientas que éste puede utilizar. Las herramientas dependen del personaje elegido, sin embargo, el código que regula la operación es idéntico para cualquier personaje.