1 Programación Orientada a ObjetosPATRONES DE DISEÑO
2 Patrones y Frameworks Una clase es un mecanismo para encapsulación. Engloba ciertos servicios proporcionados por los datos y comportamiento que es útil en el contexto de alguna aplicación. Una case simple es muy raramente la solución completa a un problema real. Existe un cuerpo creciente de investigación para describir la manera en que las colecciones de clases trabajan juntas para la solución de problemas. Frameworks de aplicación y Patrones de diseño son dos ideas que se volvieron populares en este contexto.
3 Frameworks de AplicaciónUn framework de aplicación es un conjunto de clases que cooperan de manera cercana unas con otras y juntas crean un diseño reusable para una categoría general de problemas A pesar de que se puede abstraer y discutir el diseño de los elementos que están detrás del framework, el framework mismo es un conjunto de clases específicas que están típicamente implementadas solo en una plataforma específica o en un conjunto limitado de plataformas. Los frameworks dictan la estructura general y el comportamiento de la aplicación. Describen como las responsabilidades ser reparten entre los diferentes componentes y como estos componentes interactúan.
4 Un Framework como una Librería de CabezaEn una aplicación tradicional el código específico de la aplicación define el flujo de ejecución a través del programa, invocando ocasionalmente código proporcionado por una librería. Un framework revierte esta relación: el flujo de control es dictado por el framework y el creador de un nueva aplicación simplemente cambia algunos de los métodos invocados por el framework. La herencia es frecuentemente utilizada como un mecanismo poderoso para lograr esto. Alternativamente, componentes específicos de la aplicación que obedecen una interfaz específica se pueden enchufar. ____ ___ _ __ ____ ___ _
5 Ejemplo de Framework de Aplicación (1)Frameworks de creación de GUI simplifican la creación de interfaces gráficas para sistemas de software. Un framework de aplicación de GUI implementa el comportamiento esperado de una interfaz gráfica de usuario (ventanas, botones, menús, etc) Una nueva aplicación es construida al especificar y arreglar los elementos necesarios (botones, menús, campos de texto, etc) y por redefinir ciertos métodos (repuestas al ratón y eventos de teclado.
6 Ejemplo de Framework de Aplicación (2)Frameworks de simulación simplifican la creación de aplicaciones de simulación. Un Framework de simulación provee clases de propósito general para manipular los diferentes tipos de objeto en una simulación El corazón de un framework de simulación es un procedimiento que itera a través de una lista de objetos introducidos en la simulación, preguntándole a cada uno que se actualice a si mismo El framework no conoce nada acerca de la aplicación específica en la que esta siendo usada: bolas de billar, peces en un tanque, conejos y lobos en un juego ecológico, etc.
7 Patrones de Diseño Los patrones de diseño son un intento de coleccionar y catalogar las más pequeñas arquitecturas que son recurrentes en los sistemas OO. Un patrón de diseño típicamente captura la solución a un problema que ha sido observado en muchos sistemas. Los patrones de diseño son más abstractos que un framework. Los frameworks son implementaciones parciales de (sub)sistemas, los patrones de diseño no tienen una implementación inmediata. Los patrones de diseño son elementos arquitectónicos más pequeños que los frameworks, la mayoría de aplicaciones y frameworks usan varios patrones. Los diseños de patrones son a un nivel arquitectónico lo mismo que las frases en los lenguajes de programación.
8 Tipos de Patrones de DiseñoCreación: Se preocupan del proceso de creación de un objeto Estructurales: Se preocupan de como las clases y objetos se componen para formar estructuras mas grandes. propósito Comportamiento: Se preocupan con los algoritmos y la asignación de responsabilidades entre los objetos De Clase tratan de la relación estática entre las clases y subclases De Objeto trantan con la relación entre objetos que puede cambiar en tiempo de ejecución scope
9 Patrones de Diseño CreacionalesAbstraen el proceso de instanciación: Encapsulan el conocimiento acerca de que clase concreta se usa Esconde como las instancias de estas clases son creadas y unidas Da gran cantidad de flexibilidad en que se crea, quien lo crea, como es creado, y cuando es creado. Una patrón de clase creacional usa la herencia para variar la clase que es instanciada Un patrón de objeto creacional delega la instanciación a otro objeto
10 Patrones de Diseño EstructuralLos patrones de diseño estructurales se preocupan de como las clases y objetos se unen para formar estructuras más grandes. Un patrón de clase estructural usa la herencia para componer interfaces o implementación; la composición es fijada en tiempo de diseño Un patrón de objeto estructural describe la manera de componer los objetos para crear nueva funcionalidad; la flexibilidad añadida a la composición de objetos viene de la agilidad de cambiar la composición en tiempo de ejecución
11 Patrones de Diseño de ComportamientoLos patrones de diseño de comportamiento se preocupan acerca de los algoritmos y de la asignación de responsabilidades entre los objetos. Los patrones de clase de comportamiento usan herencia para distribuir el comportamiento entre las clases Los patrones de objeto de comportamiento usan la composición de objetos en vez de la herencia.; algunos describen como un grupo de objetos coopera para llevar a cabo una tarea que un objeto simple no puede ejecutar por si mismo; otros tratan acerca de la encapsulación de comportamiento en un objeto y la delegación de peticiones a él.
12 Resumen Patrones de Comportamiento Patrones CreacionalesChain of Respons. Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor Patrones Creacionales Singleton Abstract factory Factory Method Prototype Builder Patrones Estructurales Composite Façade Proxy Flyweight Adapter Bridge Decorator
13 Los elementos de los Patrones de DiseñoUn nombre El problema que intenta resolver Incluye las condiciones para que el patrón sea aplicable La solución al problema brindada por el patrón Los elementos (clases objetos) involucrados, sus roles, responsabilidades, relaciones y colaboraciones No un diseño o implementación concreta Las consecuencias de aplicar el patrón Compromiso entre tiempo y espacio Problemas de implementación y lenguajes Efectos en la flexibilidad, extensibilidad, portabilidad
14 El Patrón Observer: El ProblemaAsume una relación uno a muchos entre objetos, donde uno cambia y los dependientes deben actualizarse Diferentes tipos de GUI mostrando los mismos datos Diferentes ventanas mostrando diferentes vistas de un mismo modelo. Sujeto Observadores También conocido como: Dependants, Publish-Subscribe
15
16 Participantes del Patrón ObservadorSujeto: conoce sus observadores, provee una interfaz para añadir (subscribir) y eliminar (cancelar) observadores y provee un método notificar que llama a actualizar en todos los observadores Observador: provee una interfase actualizar SujetoConcreto: mantiene el estado relevante para la aplicación, provee métodos para obtener y setear ese estado, llama a notificar cuando el estado es cambiado ObservadorConcreto: mantiene una referencia al sujeto concreto, guarda el estado que se mantiene consistente con el del sujeto e implementa la interfaz actualizar
17
18 La Colaboración en el Patrón ObserverEl SujetoConcreto notifica a sus observadores cada vez que se produce un cambio que pueda volver el estado de los observadores inconsistente. Después de ser informados de un cambio, el Observador Concreto puede preguntar al Sujeto acerca de la información concerniente a su estado y entonces reconciliar su propio estado con el del Sujeto. El cambio en el SujetoConcreto pude ser iniciado o uno de los ObservadoresConcretos por algún otro objeto de la aplicación
19
20
21 Las Consecuencias del Patrón Observador+ Aparejamiento abstracto y mínimo entre el Sujeto y el Observador: El sujeto no conoce la clase concreta del observador, las clases sujetoconcreto y observadorconcreto pueden ser reusadas independientemente, los sujetos y observadores pueden incluso pertenecer a diferentes capas de abstracción del sistema + Soporte para comunicación broadcast: la notificación enviada por el sujeto no necesita especificar un receptor, se transmitirá a todos las partes interesadas (subscritas) - Actualizaciones no esperadas: los observadores no tienen conocimiento de la existencia de los demás, una pequeña operación pueda causar una cascada de actualizaciones innecesarias.
22 La implementación del patrón Observador (1)Mapear los sujetos a sus observadores: El sujeto mantiene referencias explícitas a los observadores a los que debe notificar o una tabla de búsqueda es instalada; hay un compromiso entre tiempo y memoria. Observar a más de un sujeto: pude ser necesario en algunas situaciones; la interface actualizar debe ser extendida para llevar registro del sujeto que esta enviando el mensaje de actualización, permitiendo al observador saber que sujeto debe examinar. Quien dispara los cambios (quien llam a notificar): Todas las operaciones en el sujeto llaman a notificar luego de cambiar el estado del sujeto. Operaciones consecutivas pueden causar actualizaciones consecutivas que pueden no ser necesarias y no es eficiente Hacer llamadas a notificar es responsabilidad del cliente; esto es propenso a error
23 La implementación del patrón Observador (2)Las referencias colgantes a sujetos borrados: borrar un sujeto no debe producir referencias colgantes en sus observadores; solamente borrar el observador no es tampoco, frecuentemente, una buena idea. Cuando se borra un Sujeto los Observadores deben ser notificados de tal manera que puedan resetear sus referencias al Sujeto. Asegurarse que el Sujeto es consistente antes de llamar a notificar: los observadores preguntarán el nuevo estado del sujeto en su actualización; esta regla es fácilmente violada sin intención cuando la subclases de Sujeto llaman a operaciones heredadas Especificar modificaciones de interés de manera explícita: la eficiencia en la actualización puede ser mejorada cuando los observadores se registran por eventos de interés solamente
24 La implementación del patrón Observador (2)Evitar protocolos de actualización propios del observador, los modelos pull y push: En el modelo push, el sujeto envía a sus observadores información detallada en que ha cambiado; la clase sujeto hace la asunción acerca de las necesidades del Observador. En el modelo pull el Sujeto envía nada más que la información mínima de notificación y el Observador pregunta por los detalles de manera explícita; esto hace énfasis en la ignorancia del Sujeto de sus Observadores; puede ser ineficiente porque los Observadores deben acceder lo que ha cambiado sin ayuda. Encapsula actualizaciones semánticamente complejas: instala un administrador explícito de cambio que maneja la relación Sujeto-Observador y define una estrategia particular de actualización
25
26 El Patrón Composite: El ProblemaCompone objetos en estructuras de árbol para representar jerarquías parte-todo y deja que los clientes traten a los objetos individuales y composiciones de manera uniforme - Una herramienta de dibujo que permite a los usuarios construir diagramas complejos a partir de elementos simples Árboles con nodos heterogéneos, ej. El árbol de parsing de un programa
27
28
29 Participantes del patrón de composiciónComponentes: declaran al interfaz para objetos en la composición, implementa el comportamiento por defecto para la interface común de todos los objetos, declara una interfaz para acceer y manejar los componentes hijo, opcionalmene define/implementa una interfaz para acceder al componente padre Hoja: define el comportamiento para objetos primitivos de la composición Composición: define el comportamiento para los componentes que tengan hijos, guarda los componentes hijos, implemente acceso a los hijos y administran las operaciones en la interfaz del componente Cliente: manipula llos objetos en la composición a través de la interfaz componente Client: manipulates objects in the composition through the component interface
30
31
32 Colaboración en el Patrón de ComposiciónLos clientes usan la interfaz de la clase componente para interactuar con los objetos de la composición Si el receptor es una hoja, la petición es manejada directamente Si el receptor es una composición la petición es usualmente enviada a los hijos componentes, algunas operaciones se pueden ejecutar antes y/o después de enviarla.
33 Las consecuencias del Patrón Composición+ Hace al cliente más simple: los clientes pueden tratar a las estructuras compuestas y a los individuos de manera uniforme, los clientes normalmente no necesitan saber y no les debería importar si están tratando con una hoja o una composición. + Hace más fácil añadir un nuevo tipo de componentes: el código del cliente trabaja automáticamente con las composiciones u hojas recién definidas - Puede volver al diseño muy general: la desventaja de hacer sencillo el añadir nuevos componentes es que eso dificulta restringir los componentes de una composición, algunas veces en la composición se desea solo cierto tipo de hijos. Con el patrón Composición no se pude confiar en que el sistema hará cumplir esto.
34 La implementación del Patrón Composición (1)Referencias explícitas al padre: simplifica el recorrido y manejo de estructuras compuestas; son definidas mejor en la clase Componente; es esencial para mantener la invariabilidad de que todos los hijos de una composición tienen como padre a una composición que a su vez los tiene como hijos. Compartición de componentes: puede ser útil por ejemplo para reducir los requerimientos de almacenamiento, pero puede llevar a ambigüedades cuando se requiera recorrer la estructura hacia arriba. Maximizar la interface del componente: para lograr que los clientes no conozcan la clase de hoja o composición que estan usando., la clase componente debería definir tantas operaciones comunes en las clases Hoja y Composición como sea posible; esto entra en conflicto con el diseño de la jerarquía de clases que dice que una clase solo debe implementar las operaciones que tienen sentido en todas sus subclases. Se requiere cierta creatividad para encontrar buenas implementaciones por defecto ( ej. Hijos (hoja) = {})
35 La implementación del Patrón Composición (2)El acceso a los hijos y el manejo de operaciones: definir la interfaz para el manejo de los hijos a nivel del componente da transparencia pero afecta la seguridad, los clientes pueden hacer cosas sin sentido tales como añadir o borrar una hoja, esto debe capturarse en una implementación estándar: no hacer nada o arrojar un error Las variables de instancia mantienen a los hijos: comúnmente estas variables de instancia pertenecen donde las operaciones de acceso y manejo están, pero cuando están en la clase componente, se tiene un penalidad de espacio, ya que las Hojas nunca tienen hijos. Borrar componentes: en los lenguajes sin recolección de basura es mejor hacer a la Composición de borrar a sus hijos: una excepción es cuando una objeto hoja es compartido.
36 La implementación del Patrón Composición (3)La estructura de datos para guarda hijos: una variedad de estructuras de datos están disponibles: listas, árboles, arreglos, tablas has; la elección depende en la eficiencia; alternativamente cada hijo puede ser guardado en una variable de instancia separada; todas las operaciones de acceso y manejo deben entonces ser implementadas en cada subclase composición. Ordenamiento de hijos: cuando el orden de los hijos es un problema, la interfaz de acceso y manejo de los hijos debe estar diseñada cuidadosamente para manipular esta secuencia Caching: cuando la composición necesita ser recorrida o buscada frecuentemente la clase composición puede hacer caching de la información de sus hijos; los cambios a un componente requiere invalidad los caches de su padre.
37 El patrón Singleton: El ProblemaAsegura que una clase tiene exactamente una instancia y provee una punto global de acceso a ella. Solo puede haber una cola de impresión, un sistema de archivos, un manejador de ventanas en una aplicación estándar Existe solo un tablero de juego en monopolio, un laberinto en el juego de Pacman Monopoly Board : Monopoly Board : Monopoly Board
38 Participación y Colaboración en el Patrón SingletonParticipante: Singleton: Es responsable por crear y almacenar su propia instancia única. Define una operación Instancia que permite al los clientes acceder su única instancia Colaboración La operación Instancia a nivel de clase retorna o crea una sola instancia; un atributo a nivel de clase contiene un valor por defecto indicando que no hay una instancia todavía o una sola instancia
39
40 Consecuencias del Patrón Singleton+ Acceso controlado a una sola instancia: debido a que el Singleton encapsula su sola instancia, tiene control estricto sobre ella. + Reduce el espacio de nombres: es una mejora a polucionar el espacio de nombres con variables globales que contendrán instancias únicas + Permite refinamiento de operaciones y representación: la clase Singleton puede tener subclases y la aplicación pude ser configurada con una instancia de la clases necesitada en tiempo de ejecución + Permite un número variable de instancias: el mismo acercamiento puede ser usado para controlar el número de instancias que existen; una operación que de acceso a la instancia debe ser proveída + Mas flexible que usar una clase con operaciones solamente.
41 La Implementación del Patrón SingletonAsegurar una única instancia: El constructor o operación new debe estar protegida o sobrescrita para evita que se creen otras instancias accidentalmente por código del usuario. Subclases de la clase Singleton: El principal problema es instalar una única instancia de un tipo deseado en tiempo de ejecución Cuando todas las subclases son conocidas de antemano la operación Instancia puede ser un condicional y crear la instancia correcta dependiendo de algún parámetro y alimentación del usuario Cuando las subclases no son conocidas de antemano un registro puede ser usado: todas las subclases se registran antes de instanciarse; la operación Instancia escoge la instancia correcta dependiendo de esto.
42 El patrón Abstract Factory: El ProblemaProvee una interfaz para crear familias de objetos relacionados o dependientes sin especificar su clase concreta Un toolkit GUI que soporta múltiples visualizaciones Lograr portabilidad a través de aplicaciones en diferentes sistemas de ventanas También llamada: Kit
43
44 Los participantes del Patrón de Fábrica AbstractaAbstractFactory: declara una interfase para operaciones que crean objetos de productos abstractos ConcreteFactory: implementa las operaciones para crear objetos de productos concretos AbstractProduct: declara una interfase para un tipo de objeto producto ConcreteProduct: define un objeto producto a ser creado por su correspondiente fábrica; implementa la interfase AbstractProduct Cliente: usa sola interfaces declaradas por AbstractProduct y AbstractFactory
45
46
47 Colaboración en el Patrón de Fábrica AbstractaAbstractFactory difiere la creación de los objetos productos a su subclase ConcreteFactory Una instancia simple de ConcreteFactory es creada en tiempo de ejecución; esta fábrica concreta crea objetos producto que tienen una implementación dada
48 Consecuencias del Patrón Fábrica Abstracta (1)+ Clases concretas aisladas: la AbstractFactory encapsula la responsabilidad y el proceso de crear objetos producto, aísla al cliente de las clases con implementación; los clientes manipulan las instancias a través de sus interfaces abstractas; los nombres de las clases producto no aparecen en el código cliente. + Hace fácil el intercambio de familias de productos: la clase ConcreteFactory aparece solamente una vez en la aplicación, esto es, donde es instanciada, así que es fácil de remplazar; dado que la fábrica abstracta crea una familia entera de productos, la familia completa pude cambiar de manera sencilla
49 Consecuencias del Patrón Fábrica Abstracta (2)+ Promueve la consistencia entre productos: cuando los productos en una familia son diseñados para trabajar juntos, es importante para la aplicación el usar los objeto de una sola familia; el patrón de fábrica abstracta hace fácil cumplir esto. +- Soportar nuevos tipos de productos es difícil: extender las fábricas abstractas para producir una nueva clase de producto no es fácil porque el conjunto de los produtos que pueden ser creados es fija en la interface AbstractFactory; soportar nuevas clases de productos requiere extender la interfase lo que involucra cambiar la clase AbstractFactory y todas sus subclases
50 Implentación del Patrón Fábrica Abstracta (1)Las fábricas son singletons: una aplicación necesita solamente una instancia de una fábrica concreta por familia de productos, así que es mejor implementarla como un singleton Creando nuevos productos: AbstractFactory solo declara una interfaz para crear productos, le corresponde a las subclases de ConcreteFactory crear verdaderamente los productos La forma más común de hacer esto es usar un método-fábrica para cada producto; cada fábrica concreta especifica su producto al sobrescribir cada método-fábrica; es simple pero requiere una nueva fábrica concreta para cada producto en la familia, aun si solo difieren levemente. Una alternativa es implementar las fábricas concretas con el patrón prototipo; la fábrica concreta es inicializada con una instancia prototípica de cada producto y crea nuevos productos por clonación
51 Implentación del Patrón Fábrica Abstracta (2)Definir fábricas extensibles: Un diseño más flexible pero menos seguro es proveer una fábrica abstracta con un función “hacer” que tome como parámetro el tipo de objeto a crear (como cadena o identificador de clase) Es más fácil de realizar en un lenguaje dinámico que en uno estático por el tipo retornado por esta operación “hacer” Puede ser usado en C++ solo si todos los objetos productos tienen una clase base común o si los objeto productos pueden ser coercionados en el tipo que el cliente que pida el producto requiera. En este último los productos retornados tienen todos la misma interfaz abstracta y el cliente no podra diferenciar o hacer asunciones acerca de la clase del producto
52 El Patrón Factory Method: El ProblemaDefine una interfaz para crear un objeto pero deja que las subclases decidan que objeto instanciar - Cuando frameworks o toolkits uan clases abstractas para definir y manter relaciones entre objetos y son responsables de crear también los objetos Conocida también como : Virtual constructor
53
54
55 Participantes y Colaboración en el Patrón de la Método FábricaProducto: define la interfase de los objetos que el método fábrica crea ProductoConcreto: implementa la interfase Producto Creador Declara el método fábrica, que retorna un objeto tipo Producto; pude definir una implementación por defecto Puede llamar al método fábrica para crear objetos Producto CreadorConcreto: sobrescribe el método fábrica para devolver una instancia de ProductoConcreto El Creador se basa en sus subclases para definir el método fábrica que retorna una instancia de ProductoConcreto
56 Consecuencias del Patrón Método Fábrica+ Elimina la necesidad de unir clases específicas de la aplicación dentro de tu código - Los clientes pueden tener que crear una subclase de Creador solo para crear un ProductoConcreto particular + Provee ganchos para las subclases: el método fábrica da a las subclases un gancho para proveer una versión extendida de un objeto + Conecta jerarquías paralelas de clases: un cliente puede usar un método fábrica para crear una jerarquía paralela de clases.
57 Implementación del Patrón Método Fábrica (1)Existen dos variedades mayores: (1) la clase Creador es una clase abstracta y no provee una implementación para el método fábrica que declara; las subclases son requeridas para proveer una implementación. (2) la clase Creador es concreta y provee una valor por defecto para la implementación del método fábrica: le método fábrica solamente da flexibilidad a las subclases para crear diferentes objetos. El método fábrica puede ser parametrizado con algo que identifica al objeto a crear (el cuerpo es entonces un condicional); sobrescribir un método fábrica parametrizado hace fácil selectivamente extender o cambiar los productos que son creados Usar convención de nombres puede hacer claro que se esta usando métodos fábrica
58 Implementación del Patrón Método Fábrica (2)En C++ Los métodos fábrica son siempre métodos virtuales y son frecuentemente puramente virtuales Se debe tener cuidado de no llamar al método fábrica en el el constructor del Creador porque el método fábrica en el CreadorConcreto no esta disponible todavía Esto se pude evitar al acceder a productos solamente a través de operaciones de acceso que crean el producto bajo demanda; el constructor inicializa a 0, el accesor verifica y crea el producto si este no existe todavía (inicialización ociosa) Usar plantillas para evitar las subclases: en vez de crear una subclases de Creador para cada ProductoConcreto, una plantilla subclase de Creador puede ser provista que esta parametrizada con la clase Producto
59 El Patrón Prototipo: El ProblemaEspecificar las clases de objetos a crear usando una instancia prototípica y crear nuevas instancias al copiar el prototipo. - Cuando las aplicacioens necesitan la flexibilidad de ser capaces de especificar la clase a instanciar en tiempo de ejecución - Cuando las instancias de una clase tienen solamente pocas combinaciones de estado
60 Participantes y Colaboraciones en el Patrón PrototipoPrototipo: declara una interfaz para clonarse a si mismo PrototipoConcreto: implementa una operación para clonarse a si mismo Cliente: crea un nuevo objeto al pedir al prototipo que se clone a si mismo El Cliente pide al Prototipo que se clone a si mismo
61
62
63 Consecuencias del Patrón Prototipo (1)+ Esconde del cliente las clases concretas del productos: El cliente puede trabajar con las clases específicas de la aplicación sin necesidad de modificarlas. + Los productos pueden ser añadidos y removidos en tiempo de ejecución: nuevos productos concretos pueden ser incorporados solo registrándolos con el cliente + Especificar nuevos objetos por valores cambiantes: nuevas clases de objetos pueden ser efectivamente definidos al instanciar una clase específica, llenar algunas de sus variables de instancia y registrarla como un prototipo + Especificar nuevos objetos por una estructura variante: estructuras complejas definidas por el usuario pueden ser registradas como prototipos también y ser usads una y otra vez al clonarlas
64 Consecuencias del Patrón Prototipo (2)+ Reduce las subclases: al contrario que el Método Fábrica, que a menudo produce una jerarquía de clase creadora que asemeja al jerarquía de ProductosConcretos + Configura una aplicación con clases dinámicamente: cuando el ambiente de tiempo de ejecución soporta carga dinámica de clases, el patrón de prototipo es una llave para explotar esas facilidades en un lenguaje estático (los constructores de las clases cargadas dinámicamente no pueden ser accesadas de manera estática; en vez de esto el ambiente de tiempo de ejecución crea automáticamente una instancia del prototipo que la aplicación puede usar a través del manejador de prototipos) - Implementar la operación Clonar: es difícil cuando las clases en construcción existen o cuando internamente se incluye objetos que no soportan la copia o tiene referencias circulares
65 Implementación del Patrón PrototipoUsar un manejador de prototipos: cuando el número de prototipos en un sistema no es fijo, es mejor usar un registro de los prototipos existentes Implementar la operación clonación: muchos lenguajes dan soporte a la implementación del operador clonación (constructores de copia en C++, método copy en Smalltalk, guardar + cargar en sistemas que lo soportan) pero en si mismos no solucionan el problema de la copia superficial / profunda Inicializar clones: algunos clientes son felices con el clone como esta, otros desean inicializarlo; pasando parámetros a la operación clonar elimina la uniformidad de la interfase. Hay que utilizar las operaciones de cambio de estado luego de la clonación o proveer un método Inicializar En lenguajes que tratan a las clases como objetos de primera clase, el objeto clase en si mismo es como el prototipo para crear instancias de cada clase
66 El Patrón Builder Pattern: El ProblemaSeparar la construcción de un objeto complejo de su representación de tal manera que el mismo proceso de construcción pueda crear diferentes representaciones - Un lector RTF que puede convertir en varios formatos - Un parser que produce un árbol de parsing complejo Title Hello you! Title Hello you! Save-as command of Word Title Hello you!