Factory method (Gamma et al.)



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

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

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Patrones Creacionales Builder. Patrones Creacionales Abstract Factory. Patrones Creacionales Singleton. Patrones Creacionales Prototype

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler

Patrones de diseño: Test 1

Clases abstractas e interfaces

Tutorial de UML. Introducción: Objetivos: Audiencia: Contenidos:

AGRUPA P R OBJET E OS 1

Programación Orientada a Objetos en Java

Patrones de diseño. Patrón básico Handler. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Conceptos. ELO329: Diseño y Programación Orientados a Objetos. ELO 329: Diseño y Programación Orientados a Objetos

Universidad de Cantabria

2.2.- Paradigmas de la POO

Patrones de Diseño. Ezequiel Postan. 1 Libro e índice. 2 Introducción

Herencia. 3.- Herencia. Declaración de una clase derivada en Delphi. Jerarquía de clases

Modulo 1 El lenguaje Java

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

Tema: Patrones de Diseño.

Sistemas Operativos. Curso 2016 Procesos

INSTITUTO TECNOLOGICO de la laguna Programación Orientada a Objetos en C++

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases

Programación Orientada a Objetos con Java

Tema: Sobrecarga de Operadores.

Tema: Arreglos de Objetos en C++.

Clases y Objetos. Informática II Ingeniería Electrónica

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

DIAGRAMA DE CLASES EN UML

Notación UML para modelado Orientado a Objetos

Primer Parcial Septiembre 5 de 2009

Decorador y Prototype

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

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

Introducción a la programación orientada a objetos

GUIA PROGRAMACIÓN ORIENTADA A OBJETOS

15. Parámetros o argumentos

2. Conceptos básicos Abstracción La abstracción como un proceso mental natural La abstracción en el desarrollo de software

Universidad Católica del Maule. Fundamentos de Computación Especificación de tipos de datos ESPECIFICACIÓN ALGEBRAICA DE TIPOS DE DATOS

PROGRAMACIÓN ORIENTADA A OBJETOS

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

Árboles AVL. Laboratorio de Programación II

POLIMORFISMO "una interfaz, múltiples métodos".

Nombre del patrón: command orden (también es conocido como Action y Transaction)

Curso de Java POO: Programación orientada a objetos

Definición de clases: Herencia, polimorfismo, ligadura dinámica

Plantillas de clases ( Templates )

CURSO INSTALACION E IMPLEMENTACION ALOJA SOFTWARE HOTEL MODULO 02: Datos Adicionales de configuración [1]

Programación Avanzada SOLUCIÓN EXAMEN FEBRERO 2011

INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y ELÉCTRICA UNIDAD CULHUACÁN INTEGRANTES

Prof. Dr. Paul Bustamante

Guía Corta: Alcance y Asociaciones. 1. Preliminares: Nombres y Asociaciones

Capítulo 4 Patrones y Patrones de Diseño (ii)

PROGRAMACION ORIENTADA A OBJETOS Ingenieria Informática Final Febrero 2006/07

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

LENGUAJES DE CONSULTA ORIENTADOS A OBJETOS

Universidad Autónoma de Baja California Facultad de Ingeniería Mexicali

11. Algunas clases estándar de Java (II)

Ejercicio 1 (3 puntos).-

Capítulo 6. Introducción a la POO

TEMA 7: DIAGRAMAS EN UML

Apuntes de Matemática Discreta 1. Conjuntos y Subconjuntos

Índice ÍNDICE EJERCICIO 1: CÁLCULO FINANCIERO (5 PTOS.) EJERCICIO 2: AGENCIA DE COLOCACIONES (5 PTOS.)...4

Introducción a Java LSUB. 15 de enero de 2015 GSYC

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

Árbol binario. Elaborado por Ricardo Cárdenas cruz Jeremías Martínez Guadarrama Que es un árbol Introducción

Lección 24: Lenguaje algebraico y sustituciones

Constructores y Destructores

CONTENIDOS. 1. Completar el ejemplo de Herencia: Superclase Persona-Subclase Alumno

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Patrones para persistencia (I) Ingeniería del Software II

Modelado arquitectónico con UML

Programación Orientada a Objetos en JAVA

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Arreglos. // Incluir E/S y Librerías Standard #include <stdlib.h> #include <stdio.h>

Health Coaches. Recursos para. Como crear un programa de coaching

Curso de Doctorado: Tecnologías de Objetos

Antes de construir tu base de datos es conveniente saber que tipos de datos vas a almacenar y como distribuirlos.

Introducción a la Programación Orientada a Objetos

ESCUELA DE INGENIERÍA DE SISTEMAS DEPARTAMENTO DE COMPUTACIÓN PROGRAMACIÓN 2 PRÁCTICA DE LABORATORIO 7 Herencia y Composición en POO

Programación Avanzada Ingeniería Civil en Computación

Tema 2. El lenguaje de programación Java (Parte 1)

Diagramas de Clase en UML 1.1

Libertya Web Service r46gc Índice de contenido

Programación Orientada a Objetos en C#.NET CAPÍTULO 5 H E R E N C I A. Ing. Bruno López Takeyas, M.C.

FORMACIÓN DE EQUIPOS DE E-LEARNING 2.0 MÓDULO DE DISEÑO Y PRODUCCIÓN DE MATERIALES UNIDAD 6 B

9. Objetos y clases Clases

Pruebas unitarias en profundidad

LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F)

MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I Facultad de Ingeniería, UBA. Junio Cátedra: Pablo Cosso

Transcripción:

Factory method (Gamma et al.) Define una interfaz para crear un objeto pero deja a las subclases decidir que clase instanciar Motivación: Consideremos un framework que presenta múltiples documentos al usuario. Aquí aparecen dos abstracciones claves: Aplicación y Documento. Ambas clases son abstractas y los clientes deben crear las subclases respectivas para realizar sus implementaciones dependientes de la aplicación. Dado que la subclase particular de Documento a instanciar es dependiente de la aplicación, la clase Aplicación no puede predecir qué subclase Documento instanciar: la clase Aplicación sólo sabe cuando un nuevo documento debe ser instanciado pero no cuál. FactoryMethod provee una solución: encapsula el conocimiento de qué subclase de Documento crear y lo mueve fuera del framework.

Factory method Ejemplo: Las subclases de Aplicación redefinen CreateDocument para retornar la subclase de Documento apropiada

Factory method Estructura: Aplicabilidad: -Una clase no puede anticipar el tipo de objetos que debe crear -Una clase quiere que sus subclases especifiquen el objeto a crear

Factory method Otros usos: Conecta jerarquías paralelas

Implementaciones: Factory method - Variaciones: (a) La clase Creator es una clase abstracta y no provee una implementación del factory method que declara, (b) La clase Creator es una clase concreta y provee una implementación default. - Factory methods parametrizados: Un factory method puede crear múltiples productos si recibe como parámetro un valor que identifica el tipo de objeto a crear. class Creator{ public: virtual Product* create(productid); } Product* Creator::create(ProductId id){ if( id == ID_1){ return ID_1Product;} if( id == ID_2){ return ID_2Product;}... return 0; }

Factory method Redefiniendo un factory method parametrizado nos permite extender fácilmente la creación a incorporar nuevos productos o cambiar los productos que el Creador genera. class MyCreator: public Creator{ public: virtual Product* create(productid);} Product* MyCreator::create(ProductId id){ if( id == ID_1){ return ID_2Product;} if( id == ID_2){ return ID_1Product;}... if( id == ID_N){ return ID_NProduct;} return Creator::create(id); }

Iterator(continuación) AbstractList provee una interfaz común para manipular listas. Un iterador abstracto define una una interfaz de iteración común. El mecanismo de iteración es independiente de las clases agregadas concretas. Si se desea escribir código independiente de las subclases concretas, es conveniente tener un método createiterator() para solicitar el iterador a usar. Qué tipo de método es éste?

Iterator( cont.) Estructura:

Iterator(cont.) Implementaciones: - Quién controla la iteración? Si el cliente la controla se habla de iteradores externos y si el mimo iterador la controla de conocen como iteradores internos. Cuáles son más flexibles? Los externos. - Iteradores internos: cómo parametrizar el iterador con la operación que aplicar a cada elemento? template<class Item> class ListTraverser{ public: ListTraverser(List<Item*> alist); bool Traverse(); protected: virtual bool processitem(const Item); private: ListIterator<Item> _iterator; }

Iterator(cont.) template <class Item> ListTraverser<Item>::ListTraverser( List<Item>* alist):_iterator(alist){} template <class Item> bool ListTraverser<Item>::Traverse(){ bool result = false; for( iterator.first();!iterator.isdone(); _iterator.next()){ result = ProcessItem(_iterator.CurrentItem() ); if( result == false ) break; } return result; } Nota: Internamente usa un iterador externo para su recorrido.

Iterator (cont.) Ejemplo: Usarlo para imprimir los primeros diez empleados de una listade empleados. class PrintNEmployees: public ListTraverser<Employee*>{ public: PrintNEmployees(List<Employee*>* alist, int n): ListTraverser<Employee*>(aList), _total(n), _count(0){} protected: bool ProcessItem(const Employee*); private: int _total; int _count; }; bool PrintNEmployees::ProcessItem(const Employee* e){ _count++; e->print(); return _count < _total; }

Iterator (cont.) Uso: List<Employess*>* employees; //... PrintNEmployees pa(employees,10); pa.traverse(); El beneficio es que la lógica entera de la iteración puede ser reusada. Nota: Los iteradores internos pueden ser extendidos para procesar sólo los elementos si satisfacen un cierto test. Para esto junto al método para procesar Item, debe existir uno llamado TestItem(...).

Composite Modela objetos en estructuras de árbol para representar jerarquías parte-todo. - Los clientes deben ser capaces de ignorar la diferencia entre objetos compuestos y objetos individuales. Estructura:

Composite Implementación: Notar que este patrón incluye una contradicción. - El patrón hace que los clientes se olviden de las diferencias entre clases primitivas y clases compuestas. Para esto todas tienen la misma interfaz. Problema? Este diseño va en contra del principio que dice que cada clase debe tener las operaciones que tienen significado para ella. En este caso, getchild, add, remove solo tienen sentido para las subclases de Composite. - Qué implementación default podemos dar para cada una? + getchild: Si definimos que una hoja(leaf) como una componente sin hijos, podemos definir una operación default de acceso a los hijos que nunca retorna hijos. + add, remove? No se ve de manera natural

Composite - Veamos ventajas/desventajas del diseño en general: + definir estas operaciones en la raiz de la jerarquía (Component) da transparencia pues todo se maneja de manera uniforme, pero es menos segura pues los clientes pueden querer hacer add y remove de algo que no tiene sentido. + definirlas sólo en la clase Composite es más seguro pero se pierde uniformidad. + Conflicto entre transparencia y seguridad. Si optamos por seguridad en algún momento hay que usar cast: (Composite) componente. Esto tambien puede llevar a errores por eso este patrón decidió enfatizar transparencia. Recomendación: optar por seguridad agregando un método getcomposite() que retorna null si es hoja y retorna this si es compuesto. El cliente entonces agrega una nueva componente con add solo si corresponde.

Composite class Component{ public: //... virtual Composite* getcomposite(){return 0;} }; class Composite: public Component{ public: void add(component*); //... virtual Composite* getcomposite(){ return this;} }; class Leaf: public Component{ //... }

Composite Uso: Composite* acomposite = new Composite(); Leaf* aleaf = new Leaf(); Component* acomponent; Composite* test; acomponent = acomposite; if( test = acomponent->getcomposite() ){ test->add(new Leaf()); } acomponent = aleaf; if( test = acomponent->getcomposite() ){ test->add(new Leaf()); // No se agrega }