Patrones
Patrones
Emisión
Módulo 2
Principios y Patrones de Diseño
Mtro. Alfonso Gregorio Rivero Duarte
Objetivo
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Lo que veremos
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
¿Qué es un Patrón?
Se puede decir que un patrón son soluciones probadas para un problema en especifico,
estos nos ayudaran a comprender a la perfección los principios fundamentales de
diseño.
Las decisiones del diseño nos brindan la posibilidad de identificar los módulos de un
sistema de software y como funcionaran estos módulos juntos para alcanzar los
objetivos.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
GoF
• Erich Gamma
• Richard Helm
• Ralph Johnson
• John Vissides
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Criterios de Diseño
• Bajo acoplamiento: Esto debe aplicarse para que los cambios hechos en un sección
no afecten a otras secciones relacionadas o no relacionadas, el clásico efecto es si
hacemos un cambio en la interfaz gráfica y tengamos que cambiar algo en la base de
datos, es frágil la aplicación.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Categorías de los Patrones
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern
Estructura Monolítica
Difícil reusar partes
Complicado mantenimiento:
¿Añadir una moneda?
¿Quitar una moneda?
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern
Sencillo
Mantenible
Usable
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Chain of Responsability pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Chain of Responsability pattern
“Avoid coupling the sender of a request to its receiver by giving more than one object a
chance to handle the request. Chain the receiving objects and pass the request along
the chain until an object handles it.”
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Design Patterns Simplified
https://refactoring.guru/es/design-patterns
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
Objetivo: Crear un objeto para una única instancia, por ejemplo para configuraciones
globales, para almacenar registros o pools de conexiones.
Técnica: Una clase tiene una sola instancia y debe proporcionar acceso global.
Ejemplo: Se necesita crear un único objeto que permita guardar datos en archivos.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
Ejemplos:
De los más sencillos y quizás el más polémico del catálogo.
La idea es muy sencilla. La parte más interesante es implementarlo de forma segura.
Conceptualmente no tiene complejidad, pero existen serie de errores que se pueden
cometer en la implementación.
Objetos que necesitamos se creen una sola vez:
Registros
Preferencias globales o configuración
Login
Caches
Pools
…
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
Su intención consiste en garantizar que una clase solo tenga una instancia y
proporcionar un punto de acceso global a ella.
El patrón singleton se implementa creando en nuestra clase un método que crea una
instancia del objeto solo si todavía no existe alguna. Para asegurar que la clase no puede
ser instanciada nuevamente se regula el alcance del constructor (con modificadores de
acceso como protegido o privado).
La instrumentación del patrón puede ser delicada en programas con múltiples hilos de
ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo y esta no
existe todavía, solo uno de ellos debe lograr crear el objeto. La solución clásica para este
problema es utilizar exclusión mutua en el método de creación de la clase que
implementa el patrón.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
Las situaciones más habituales de aplicación de este patrón son aquellas en las que
dicha clase controla el acceso a un recurso físico único (como puede ser el ratón o un
archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible
para todos los demás objetos de la aplicación.
“Ensure a class only has one instance, and provide a global point of Access to it.”
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
¿Problemas?
public class Unico implements Serializable {
private static Unico INSTANCE;
public static Unico getUnico(){
if (INSTANCE == null) {
INSTANCE = new Unico();
}
return INSTANCE;
}
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
¿Más Problemas?
public class Unico implements Serializable {
private static Unico INSTANCE;
private Unico(){}
public static Unico getUnico(){
if (INSTANCE == null) {
INSTANCE = new Unico();
}
return INSTANCE;
}
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
¿Más Problemas?
public class Unico implements Serializable {
private static Unico INSTANCE;
private Unico(){}
Public synchronized static Unico getUnico(){
if (INSTANCE == null) {
INSTANCE = new Unico();
}
return INSTANCE;
}
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
A partir de Java 1.5 se recomienda usar Enums con una sola instancia
public enum Unico {
INSTANCE;
//metodos;
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
package dgtic.inicio;
import dgtic.modelo.Archivo;
public class Inicio {
public static void main(String[] args) {
Archivo archivo=Archivo.getInstancia();
Archivo archivoDos=Archivo.getInstancia();
System.out.println(archivo.equals(archivoDos));
System.out.println(archivoDos.equals(archivo));
}
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern
Usar enums!
private EagerSingleton() {}
private LazySingleton() {}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Abstract Factory pattern
Técnica: Poder definir interfaces o clases abstractas para crear objetos, y dejar que las
subclases decidan qué clase instanciar.
Ejemplo: Quieren los clientes ocupar conexiones de base de datos de dos paradigmas
diferentes, modelo relacional y el modelo no relacional, de sus dos repositorios
profesores y materias.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Práctica Abstract factory pattern versión 1
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Abstract Factory pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Abstract factory Pattern versión 2
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Abstract factory pattern versión 2
package dgtic.inicio;
import dgtic.repositorio.implementacion.FactoryNoSQL;
import dgtic.repositorio.implementacion.FactoryRelacional;
import dgtic.repositorio.interfaces.RepositorioAbstractFactory;
import dgtic.repositorio.interfaces.RepositorioMaterias;
import dgtic.repositorio.interfaces.RepositorioProfesores;
public class Principal {
public static void main(String[] args) {
RepositorioAbstractFactory factory=new FactoryRelacional();
RepositorioProfesores rep=factory.crearRespositorioProfesores();
rep.listaProfesores();
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Abstract Factory pattern
Resumiendo
Este pattern permite que en caso de que nuestra aplicación utilice familias de objetos
diferentes según el entorno, podamos centralizar la decisión de qué tipo de objetos
crear en un solo punto.
Se simplifica el código cliente, y más, el sistema puede extenderse de forma mucho
más fácil.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Builder Pattern
Builder Pattern
Ejemplo: Los clientes desean construir un objeto profesor, con la diferencia que en
tiempo de compilación si tiene base, que indique en que departamento esta o si tiene
asignatura indicar las materias que imparte.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Builder Pattern
Ejemplo:
Necesitamos una clase Persona, con nombre y edad (los dos obligatorios).
Builder Pattern
"Separate the construction of a complex object from its representation so that the same
construction process can create different representations.“
Por lo tanto, debemos crear una nueva clase cuya única responsabilidad es crear objetos de tipo
Persona.
Builder Pattern
Este pattern existe por defecto al usar API de terceros como Spring / Hibernate
Este pattern ayuda a entender mejor estas API
Builder Pattern
public Builder setMayor(int edad) {
if (edad < 18)
throw new IllegalArgumentException(“Es menor de edad ” + edad);
persona.edad = edad; public class BuilderMayor {
return new Persona.BuilderMayor(persona); private Persona persona;
}
public BuilderMayor(Persona persona) {
public Persona build() { this.persona = persona;
return persona; }
}
public BuilderMayor setLugarTrabajo(String trabajo) {
persona.lugarTrabajo = trabajo;
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Builder Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Builder Pattern
package fes.aragon.inicio;
import fes.aragon.modelo.Departamento;
import fes.aragon.modelo.Materias;
import fes.aragon.modelo.Profesor;
import fes.aragon.modelo.Tipo;
public class Principal {
public static void main(String[] args) {
Profesor profesor=new Profesor.Builder("Fernando")
.setTipoBase(Tipo.BASE)
.setDepartamento(Departamento.COMPUTACION)
.build();
Profesor profesorDos=new Profesor.Builder("Maria")
.setTipoAsignatura(Tipo.ASIGNATURA)
.setMaterias(Materias.ALGEBRA,Materias.CALCULO)
.build();
System.out.println(profesor.toString());
System.out.println(profesorDos.toString());
}
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern
Factory Method Pattern
Objetivo: Definir una interfaces para crear un objeto, pero se dejar a las subclases que
clase concreta instanciar.
Técnica: Utilizar una interfaz (clase abstracta o interfaz), y las subclases indicaran el tipo
de clase a instanciar.
Ejemplo: Se quiere construir un objeto de tipo reloj, pero las subclases deben definir el
tipo de cristal, ya sea de vidrio o platico.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern
Nos ayudará cuando necesitemos crear objetos con una inicialización compleja
O viene un tipo devuelto o algunos de sus componentes puede variar según la situación
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern
Siguiendo el ejemplo, hay que crear clases del tipo Coche, sin embargo, la gran
diferencia es que se pueden crear con distintos tipos de mandos.
Problema: como encapsular la creación e inicialización del objeto, si este puede tener
distintos tipos?
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern
"Define an interface for creating an object, but let subclases decide which class to instantiate. The Factory
Method lets a class defer instantiation it uses to subclasses.“
Uso del término interface no es término de interface en java, sino interface que ataca al cliente.
La clase que es usada por el cliente creara el objeto con toda su inicialización pero delegará en subclases
concretas que tipos específicos tiene que crear
public abstract class CocheFactory {
public Coche crea() {
Coche coche = creaCoche();
coche.ponerChasis();
coche.ponerMandos();
coche.ponerRuedas();
return coche;
}
protected abstract Coche creaCoche();
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern
Ahora cada tipo de coche particular tendría una implementación de CocheFactory indicando el tipo de
coche a crear.
El cliente decidiría que tipo de Factory usar pero siempre usaría el método crea para obtener el coche.
Cliente
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern
package dgtic.inicio;
import dgtic.modelo.Reloj;
import dgtic.modelo.interfaz.RelojCristalPlasticoFactory;
import dgtic.modelo.interfaz.RelojCristalVidrioFactory;
import dgtic.modelo.interfaz.RelojFactory;
public class Inicio {
public static void main(String[] args) {
RelojFactory factory=new RelojCristalPlasticoFactory();
Reloj reloj=factory.crea();
System.out.println(reloj.toString());
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern
Ejemplo: Se tienen perros que corren, caminan y buscan cosas, pero también tenemos
perros viejos que solo caminan y duermen, se quiere unir las dos clases de perros para
una exposición canina.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern
public class MiSistemaReservas implements ReservasSL, StandardReservasACME {
@Override
public String getInfoHotel(String idHotel) {
return hotelInfo(idHotel);
}
@Override
Public String hotelInfo (String idHotel) {
return “info del hotel “ + idHotel;
}
}
NO TOCAR la clase existente que implementa ReservasSL y crear una nueva clase que
implemente la nueva interface StandardReservaACME.
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern
public class StandardReservasACMEAdapter implements StandardReservasACME {
private ReservasSL miSistema,
public StandardReservasACMEAdapter (ReservasSL miSistema) {
this.miSistema = miSistema;
}
@Override
public String getInfoHotel(String idHotel){
return miSistema.hotelInfo(idHotel);
}
@Override
public String createReservation(Date fecha, int días, String idHotel, String cliente) {
long código = miSistema.creaReserva(idHotel, cliente, fecha, dias);
return String.valueOf(codigo);
}
@Override
public String getReservation(String codigo) {
long codigoLong = Long.parseLong(codigo);
return miSistema.datosReserva(codigoLong);
}
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Adapter Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Adapter Pattern
package dgtic.inicio;
import dgtic.adapter.ViejoPerroAdaptador;
import dgtic.modelo.PerroJoven;
import dgtic.modelo.PerroViejo;
import dgtic.servicio.ExposicionCanina;
public class Inicio {
public static void main(String[] args) {
PerroViejo viejo=new PerroViejo("Rojo");
PerroJoven nuevo=new PerroJoven("Negro");
ViejoPerroAdaptador adapta=new ViejoPerroAdaptador(viejo);
ExposicionCanina expo=new ExposicionCanina();
expo.competencia(adapta);
System.out.println("-----");
expo.competencia(nuevo);
}
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern
Mediator Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern
Mediator Pattern
Implementación directa:
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Lo que aprendimos
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Contacto
Tels: 5528997069
Redes sociales:
https://www.linkedin.com/in/alfonso-gregorio-r-139a9225/