Grado en Ingeniería de las Tecnologías de Telecomunicación (GITT)
Universidad de Sevilla - Tercer Curso
Este repositorio contiene una recopilación de implementaciones de diversos patrones de diseño en Java, principalmente obtenidos de https://www.javacodegeeks.com/?s=java+patterns
Los patrones de diseño son soluciones probadas a problemas comunes en el diseño de software orientado a objetos.
Se presentan los siguientes patrones de diseño:
Ubicación: src/com/javacodegeeks/patterns/adapterpattern/
Propósito: Permite reutilizar una implementación existente, que implementa una interfaz que no es la esperada por el cliente. Actúa como un puente entre la interfaz de la implementación disponible y la esperada por el cliente.
Implementación:
- Interfaces:
XpayyPayD- Dos sistemas de pago incompatibles - Adaptador:
PayX2PayDAdapter- Adapta la interfaz Xpay a PayD - Cliente: Preparado para trabajar con la interfaz
PayD, pero puede usar implementaciones deXpaymediante el adaptador - Ejemplo:
RunAdapterExample.java- Demuestra cómo el cliente puede usar XpayImpl a través del adaptador
Caso de uso: Integración de sistemas de pago diferentes sin modificar el código cliente.
Ubicación: src/com/javacodegeeks/patterns/builderpattern/
Propósito: Separa la construcción de objetos complejos de su representación, permitiendo crear diferentes tipos de objetos utilizando el mismo proceso de construcción.
Implementación:
- Producto:
Car- El objeto complejo a construir - Builder abstracto:
CarBuilder- Define la interfaz para construir coches - Builders concretos:
SedanCarBuilder- Construye coches sedánSportsCarBuilder- Construye coches deportivos
- Director:
CarDirector- Controla el proceso de construcción - Formulario:
Form- Representa configuración adicional - Ejemplo:
TestBuilderPattern.java- Demuestra cómo construir diferentes tipos de coches
Caso de uso: Construcción de objetos complejos con diferentes configuraciones manteniendo el mismo proceso.
Ubicación: src/com/javacodegeeks/patterns/proxypattern/
Propósito: El objeto proxy proporciona al cliente un sustituto o representante del objeto que se pretende utilizar, implementando la misma interfaz pero permitiendo controlar el acceso al representado. El cliente no interacciona directamente con el objeto de interés, sino a través de su representante o proxy.
El proyecto implementa tres variantes del patrón Proxy:
Ubicación: proxypattern/virtualproxy/
Propósito: Retrasa la creación y/o inicialización de objetos costosos hasta que realmente sean necesarios.
Implementación:
- Interfaz:
ContactList- Define operaciones sobre listas de contactos - Objeto real:
ContactListImpl- Implementación real que crea la lista completa de empleados - Proxy:
ContactListProxyImpl- Retrasa la creación de la lista hasta que se solicita por primera vez - Contexto:
Company- Usa la lista de contactos a través del proxy - Ejemplo:
TestVirtualProxy.java- Demuestra la carga perezosa (lazy loading)
Caso de uso: Optimización de memoria retrasando la carga de listas grandes hasta que se necesiten.
Ubicación: proxypattern/protection/protectionproxy/
Propósito: Controla el acceso a un objeto basándose en permisos o roles de usuario.
Implementación:
- Interfaz:
ReportGeneratorProxy- Define operaciones para generar informes - Proxy:
ReportGeneratorProtectionProxy- Controla acceso según el tipo de usuario - Usuarios:
Owner- Tiene permisos completosEmployeeyStaff- Permisos limitados
- Ejemplo:
TestProtectionProxy.java- Demuestra control de acceso basado en roles
Caso de uso: Restricción de acceso a funcionalidades según el rol del usuario.
Ubicación: proxypattern/remoteproxy/
Propósito: Proporciona un representante local de un objeto que existe en un espacio de direcciones diferente.
Implementación:
- Interfaz:
ReportGenerator- Define la generación de informes - Implementación:
ReportGeneratorImpl- Implementación real del generador - Cliente:
ReportGeneratorClient- Cliente que usa el generador remoto
Caso de uso: Acceso transparente a objetos remotos como si fueran locales.
Ubicación: src/factorymethod/
Propósito: Define una interfaz para crear objetos, pero permite a las subclases decidir qué clase instanciar. Delega la implementación del algoritmo de instanciación a las subclases.
Implementación:
- Producto abstracto:
Figura- Clase base para todas las figuras geométricas - Productos concretos:
Circulo,Cuadrado,Rectangulo,Triangulo- Figuras estándarOtroCirculo,OtroCuadrado- Variantes alternativas
- Fábrica abstracta:
FabricaFiguras- Define el método fábrica - Fábrica concreta:
MiFabrica- Implementa la creación de figuras específicas - Extensiones:
MiFigura- Figura personalizada - Utilidades:
OrdenacionArea- Ordena figuras por área
- Gestores de colecciones:
GestorColeccion- Gestor base abstractoGestorCirculos,GestorCuadrados,GestorRectangulos,GestorTriangulos- Gestores específicos para cada tipo de figura
- Aplicaciones:
Colecciones.java- Ejemplo sin Factory MethodColeccionesFM.java- Ejemplo utilizando Factory Method para gestionar colecciones de figuras
Caso de uso: Sistema de gestión de figuras geométricas donde el tipo concreto de figura se determina en tiempo de ejecución.
Patrones/
├── src/ # Código fuente
│ ├── com/javacodegeeks/patterns/
│ │ ├── adapterpattern/ # Patrón Adapter
│ │ ├── builderpattern/ # Patrón Builder
│ │ └── proxypattern/ # Patrón Proxy (3 variantes)
│ └── factorymethod/ # Patrón Factory Method
│ ├── colecciones/ # Gestores de colecciones
│ └── utilidades/ # Figuras y fábricas
└── bin/ # Archivos compilados (.class)
Cada patrón incluye una clase de prueba principal:
-
Adapter Pattern:
java com.javacodegeeks.patterns.adapterpattern.site.RunAdapterExample
-
Builder Pattern:
java com.javacodegeeks.patterns.builderpattern.TestBuilderPattern
-
Proxy Pattern - Virtual:
java com.javacodegeeks.patterns.proxypattern.virtualproxy.TestVirtualProxy
-
Proxy Pattern - Protection:
java com.javacodegeeks.patterns.proxypattern.protection.protectionproxy.TestProtectionProxy
-
Factory Method:
java factorymethod.colecciones.Colecciones # o java factorymethod.colecciones.ColeccionesFM
- Builder: Construcción paso a paso de objetos complejos
- Factory Method: Creación de objetos delegada a subclases
- Adapter: Compatibilidad entre interfaces incompatibles
- Proxy: Control de acceso a objetos (Virtual, Protection, Remote)
Este proyecto está diseñado para:
- Entender los patrones de diseño fundamentales
- Ver implementaciones prácticas en Java
- Aprender cuándo y cómo aplicar cada patrón
- Estudiar las diferencias entre variantes de un mismo patrón (ej: tipos de Proxy)
- JavaCodeGeeks - Algunos ejemplos están basados en tutoriales de JavaCodeGeeks, modificados con propósitos educativos
- Gang of Four (GoF) - "Design Patterns: Elements of Reusable Object-Oriented Software"
- ✅ Reutilización: Soluciones probadas y documentadas
- ✅ Comunicación: Vocabulario común entre desarrolladores
- ✅ Mantenibilidad: Código más fácil de entender y modificar
- ✅ Flexibilidad: Sistemas más adaptables a cambios
- ✅ Mejores prácticas: Aplicación de principios SOLID
- Open/Closed Principle: Abierto para extensión, cerrado para modificación
- Dependency Inversion: Depender de abstracciones, no de implementaciones concretas
- Single Responsibility: Cada clase tiene una única responsabilidad
- Interface Segregation: Interfaces específicas mejor que una general
Este README proporciona una guía general. Consulta el código fuente y los comentarios dentro de cada clase para detalles específicos de implementación.