Want to create interactive content? It’s easy in Genially!

Get started free

Presentación Meeting Plan

Valeria Avellaneda

Created on November 22, 2024

Start designing with a free template

Discover more than 1500 professional designs like these:

Geniaflix Presentation

Vintage Mosaic Presentation

Shadow Presentation

Newspaper Presentation

Zen Presentation

Audio tutorial

Pechakucha Presentation

Transcript

PATRONES DE DISEÑO

EMPEZAR

¿Qué es un patrón de diseño?

Los patrones de diseño son soluciones habituales a problemas que ocurren con frecuencia en el diseño de software. Son como planos prefabricados que se pueden personalizar para resolver un problema de diseño recurrente.

No se trata de un algoritmo que puedes elegir y copiarlo en el programa como si se tratara de funciones o bibliotecas ya preparadas. El patrón no es una porción específica de código, sino un concepto general para resolver un problema particular. Puedes seguir los detalles del patrón e implementar una solución que encaje con las realidades de tu propio programa.

Clasificación de los patrones

Patrones creacionales

Los patrones creacionales proporcionan varios mecanismos de creación de objetos que incrementan la flexibilidad y la reutilización del código.

Patrones estructurales

Los patrones estructurales explican cómo ensamblar objetos y clases en estructuras más grandes, a la vez que se mantiene la flexibilidad y eficiencia de estas estructuras.

Patrones de comportamiento

Los patrones de comportamiento tratan con algoritmos y la asignación de responsabilidades entre objetos.

Factory Method

Problema

Tengo una aplicación de gestión logística. La primera versión de la aplicación sólo es capaz de manejar el transporte en camión. Al cabo de un tiempo, la aplicación se vuelve popular y se necesita incorpores la logística por mar.Pero, ¿qué pasa con el código? la mayor parte del código está acoplado a la clase Camión . Para añadir barcos u otro tipo de transporte a la aplicación a la aplicación habría que hacer cambios en toda la base del código. Al final se tiene con un código bastante sucio, plagado de condicionales que cambian el comportamiento de la aplicación dependiendo de la clase de los objetos de transporte.

Factory Method

Solución

El patrón Factory Method sugiere que, en lugar de llamar al operador new para construir objetos, se invoque a un método fábrica. Los objetos se siguen creando a través del operador new , pero se invocan desde el método fábrica. Los objetos devueltos por el método fábrica a menudo se denominan productos. Solo se ha cambiado el lugar desde donde se invoca al constructor. Ahora se puede sobrescribir el método fábrica en una subclase y cambiar la clase de los productos creados por el método.

Factory Method

Solución

Tanto la clase Camión como la clase Barco deben implementar la interfaz Transporte , que declara un método llamado entrega. Cada clase implementa este mé- todo de forma diferente: los camiones entregan su carga por tierra, mientras que los barcos lo hacen por mar. El método fábrica dentro de la clase LogísticaTerrestre devuelve objetos de tipo camión, mientras que el método fábrica de la clase LogísticaMarítima devuelve barcos.

Factory Method

Estructura

El producto declara la interfaz, que es común a todos los objetos que puede producir la clase creadora y sus subclases.

Los productos concretos son distintas implementaciones de la interfaz de producto.

La clase creadora declara el método que fábrica el producto que devuelve nuevos objetos de producto. Es importante que el tipo de retorno de este método coincida con la interfaz de producto.

Los creadores concretos sobrescriben el Factory Method base, de modo que devuelva un tipo diferente de producto.

ejemplo

Vamos a realizar un ejemplo para ver cómo se puede utilizar Factory Method para crear elementos de interfaz de usuario (UI) multiplataforma sin acoplar el código cliente a clases UI concretas.

Factory Method

¿Cuándo usarlo? Cuando tenemos varios tipos similares de objetos y no queremos llenar nuestro código de if-else

¿Cómo funciona? Creamos una interfaz común Hacemos clases que implementen esa interfaz Creamos una "fábrica" que decide cuál crear Usamos la fábrica en lugar de crear objetos directamente

Ventaja principal: Nuestro código es más fácil de mantener y extender

Abstract Factory

Es un patrón de diseño creacional que nos permite producir familias de objetos relacionados sin especificar sus clases concretas.

Lo primero que sugiere el patrón Abstract Factory es que declaremos de forma explícita interfaces para cada producto diferente de la familia de productos. Después podemos hacer que todas las variantes de los productos sigan esas interfaces.

El siguiente paso consiste en declarar la Fábrica abstracta: una interfaz con una lista de métodos de creación para todos los productos que son parte de la familia de productos . Estos métodos deben devolver productos abstractos representados por las interfaces

Abstract Factory

Problema

Estamos creando un simulador de tienda de muebles. El código está compuesto por clases que representan lo siguiente: * Una familia de productos relacionados, digamos: Silla + Sofá + Mesilla . *Algunas variantes de esta familia. Por ejemplo, los productos Silla + Sofá + Mesilla están disponibles en estas variantes: Moderna , Victoriana , ArtDecó . Necesitamos una forma de crear objetos individuales de mobiliario para que combinen con otros objetos de la misma familia. Los clientes se enfadan bastante cuando reciben muebles que no combinan. Además, no queremos cambiar el código existente al añadir al programa nuevos productos o familias de productos.

Abstract Factory

Solución

Lo primero que sugiere el patrón Abstract Factory es que declaremos de forma explícita interfaces para cada producto diferente de la familia de productos. Después podemos hacer que todas las variantes de los productos sigan esas interfaces. Por ejemplo, todas las variantes de silla pueden implementar la interfaz Silla , así como todas las variantes de mesilla pueden implementar la interfaz Mesilla , y así sucesivamente.

Abstract Factory

Solución

El segundo paso consiste en declarar la Fábrica abstracta: una interfaz con una lista de métodos de creación para todos los productos que son parte de la familia de productos. Por ejemplo, crearSilla , crearSofá y crearMesilla. Estos métodos deben devolver productos abstractos representados por las interfaces que extrajimos previamente: Silla , Sofá , Mesilla , etc ¿Qué hay de las variantes de los productos? Para cada variante de una familia de productos, creamos una clase de fábrica independiente basada en la interfaz FábricaAbstracta. Una fábrica es una clase que devuelve productos de un tipo particular. Por ejemplo, la FábricadeMueblesModernos sólo puede crear objetos de SillaModerna , SofáModerno y MesillaModerna .

Abstract Factory

Los productos Abstractos declaran interfaces para un grupo de productos diferentes pero relacionados que forman una familia de productos.

Los productos Concretos son implementaciones distintas de productos abstractos agrupados por variantes. Cada producto abstracto debe implementarse en todas las variantes dadas.

La interfaz fabrica Abstracta declara un grupo de métodos para crear cada uno de los productos abstractos.

Las fabricas Concretas implementan métodos de creación de la fábrica abstracta. Cada fábrica concreta se corresponde con una variante específica de los productos y crea tan solo dichas variantes de los productos.

ejemplo

Vamos a realizar un ejemplo donde se puede utilizar el patrón Abstract Factory para crear elementos de interfaz de usuario (UI) multiplataforma sin acoplar el código cliente a clases UI concretas, mientras se mantiene la consistencia de todos los elementos creados respecto al sistema operativo seleccionado.

Singleton - Instancia única

Es un patrón de diseño creacional que permite asegurarnos de que una clase tenga una única instancia, a la vez que proporciona un punto de acceso global a dicha instancia.

Garantizar que una clase tenga una única instancia. El motivo más habitual es controlar el acceso a algún recurso compartido, por ejemplo, una base de datos o un archivo.

Proporcionar un punto de acceso global a dicha instancia. Al igual que una variable global, el patrón Singleton nos permite acceder a un objeto desde cualquier parte del programa. No obstante, también evita que otro código sobre-escriba esa instancia.

Singleton - Instancia única

Problema

Garantizar que una clase tenga una única instancia. El motivo más habitual es controlar el acceso a algún recurso compartido, por ejemplo, una base de datos o un archivo.

Funciona así: imagina que has creado un objeto y al cabo de un tiempo decides crear otro nuevo. En lugar de recibir un objeto nuevo, obtendrás el que ya habías creado. Ten en cuenta que este comportamiento es imposible de implementar con un constructor normal, ya que una llamada al constructor siempre debe devolver un nuevo objeto por diseño. Y no queremos que el código que resuelve el primer problema se encuentre disperso por todo el programa. Es mucho más conveniente tenerlo dentro de una clase, sobre todo si el resto del código ya depende de ella.

Singleton - Instancia única

Solucion

Hacer privado el constructor por defecto para evitar que otros objetos utilicen el operador new con la clase Singleton. Crear un método de creación estático que actúe como constructor. Tras bambalinas, este método invoca al constructor privado para crear un objeto y lo guarda en un campo estático. Lassiguientes llamadas a este método devuelven el objeto almacenado en caché. Si el código tiene acceso a la clase Singleton, podrá invocar su método estático. De esta manera, cada vez que se invoque este método, siempre se devolverá el mismo objeto.

ejemplo

Veamos un ejemplo donde la clase de conexión de la base de datos actúa como Singleton. Esta clase no tiene un constructor público, por lo que la única manera de obtener su objeto es invocando el método obtenerInstancia. Este método almacena en caché el primer objeto creado y lo devuelve en todas las llamadas siguientes

Singleton

Utiliza el patrón Singleton cuando una clase de tu programa tan solo deba tener una instancia disponible para todos los clientes; por ejemplo, un único objeto de base de datos compartido por distintas partes del programa.

Utiliza el patrón Singleton cuando necesites un control más estricto de las variables globales.