Introducción a los patrones de diseño
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 64 de 87.
Los patrones de diseño son soluciones comprobadas para problemas comunes que los desarrolladores encuentran repetidamente al crear software. En lugar de reinventar la rueda cada vez, puedes aplicar estas plantillas probadas a lo largo del tiempo para resolver desafíos de diseño recurrentes.
Piensa en los patrones de diseño como planos. No te proporcionan código terminado para copiar y pegar, sino que describen cómo estructurar tus clases y objetos para resolver un tipo específico de problema. Los patrones que aprenderás aprovechan los conceptos de OOP que ya dominas: herencia, interfaces, polimorfismo y composición.
Los patrones de diseño se dividen en tres categorías principales:
| Categoría | Propósito | Ejemplos |
|---|---|---|
| Creacionales | Cómo se crean los objetos | Singleton, Factory, Builder |
| Estructurales | Cómo se componen los objetos | Adapter, Decorator, Composite |
| De comportamiento | Cómo se comunican los objetos | Observer, Strategy, Command |
¿Por qué aprender patrones de diseño? Te proporcionan un vocabulario compartido con otros desarrolladores: decir «usa una Factory aquí» comunica al instante una idea compleja. También te ayudan a escribir código más flexible y fácil de mantener al aplicar principios como «programa para una interfaz, no para una implementación».
En las próximas lecciones, implementarás varios patrones esenciales, comenzando con patrones creacionales como Singleton y Factory, después pasando a patrones de comportamiento como Observer y Strategy.
Desafío
Fácil¡Construyamos un clasificador sencillo de patrones que demuestre tu comprensión de las tres categorías de patrones de diseño! Crearás un sistema que categoriza los patrones y explica su propósito, organizando tu código en varios archivos.
Crearás tres archivos:
Pattern.java: Crea una interfaz llamadaPatternque defina el contrato para todos los patrones de diseño. Tu interfaz debe declarar dos métodos:String getCategory(), que devuelve la categoría del patrón (Creational, Structural o Behavioral), yString getPurpose(), que devuelve una descripción de lo que hace esa categoría de patrones.PatternInfo.java: Crea tres clases que implementen tu interfazPattern, cada una representando una categoría de patrones de diseño:CreationalPattern: debe devolver"Creational"para la categoría y"How objects are created"para el propósito.StructuralPattern: debe devolver"Structural"para la categoría y"How objects are composed"para el propósito.BehavioralPattern: debe devolver"Behavioral"para la categoría y"How objects communicate"para el propósito.Main.java: ¡Integra tu clasificador de patrones! Recibirás una entrada: el nombre de un patrón (String), que será uno de"Singleton","Factory","Adapter","Decorator","Observer"o"Strategy".Según la entrada, crea el objeto de patrón apropiado:
"Singleton"y"Factory"son patrones Creational"Adapter"y"Decorator"son patrones Structural"Observer"y"Strategy"son patrones Behavioral
Guarda tu objeto de patrón en una variable de tipo
Pattern(la interfaz), demostrando el principio de programar contra una interfaz. Después, imprime las siguientes tres líneas:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
Recibirás una entrada: el nombre de un patrón de diseño (String).
Este desafío refuerza la idea clave de la lección: los patrones de diseño se organizan en categorías según el problema que resuelven. Al utilizar una interfaz, también practicas el principio de «programar contra una interfaz, no contra una implementación», un concepto fundamental que hace que los patrones de diseño sean tan potentes.
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: Declara una variable de tipo Pattern (la interfaz)
Pattern pattern = null;
// TODO: Basándote en patternName, crea el objeto de patrón apropiado:
// - "Singleton" y "Factory" son patrones creacionales
// - "Adapter" y "Decorator" son patrones estructurales
// - "Observer" y "Strategy" son patrones de comportamiento
// TODO: Imprime la salida en el siguiente formato:
// Pattern: [nombre del patrón de entrada]
// Category: [categoría de getCategory()]
// Purpose: [propósito de getPurpose()]
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón IteratorPractica por tu cuenta: Compilador de Java online