Introducción a los patrones de diseño
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 70 de 91.
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 establecidas para resolver desafíos similares en tu propio código.
Piensa en los patrones de diseño como recetas. Al igual que un chef sigue una receta para crear un plato perfeccionado con el tiempo, los desarrolladores usan patrones de diseño para estructurar su código de maneras que han sido probadas y perfeccionadas por innumerables programadores antes que ellos.
Los patrones de diseño suelen agruparse en tres categorías:
| Categoría | Propósito | Ejemplos |
|---|---|---|
| Creacional | Cómo se crean los objetos | Singleton, Factory |
| Estructural | Cómo se componen los objetos | Adapter, Decorator |
| De comportamiento | Cómo se comunican los objetos | Observer, Strategy |
En realidad, has estado utilizando patrones a lo largo de este curso sin darte cuenta. Cuando creaste clases abstractas con métodos que las clases hijas deben implementar, estabas aplicando una forma del patrón Template Method. Cuando utilizaste interfaces para definir contratos, estabas preparando el terreno para el patrón Strategy.
Aprender patrones de diseño te proporciona un vocabulario compartido con otros desarrolladores. En lugar de explicar una estructura compleja en detalle, simplemente puedes decir «usé el patrón Factory aquí» y los desarrolladores experimentados entenderán inmediatamente tu enfoque. En las siguientes lecciones, implementaremos varios patrones esenciales en PHP.
Desafío
FácilConstruyamos un sistema sencillo de formato de mensajes que demuestre cómo los patrones de diseño ayudan a organizar el código. Identificarás a qué categoría de patrones pertenece cada componente y verás cómo trabajan juntas las distintas partes de un sistema.
Organizarás tu código en tres archivos:
MessageFormatter.php: Crea una interfaz llamadaMessageFormatterque defina un contrato para dar formato a los mensajes. Debe tener un único métodoformat(string $message): string. Esto representa la categoría de comportamiento. Define cómo se comunican los objetos y procesan los datos.Formatters.php: Incluye el archivo MessageFormatter y crea dos clases que implementen la interfaz:UppercaseFormatter: Su métodoformat()devuelve el mensaje convertido a mayúsculasBracketFormatter: Su métodoformat()envuelve el mensaje entre corchetes, como[message]
main.php: Incluye el archivo Formatters. Recibirás dos entradas: una cadena de mensaje y un tipo de formateador ("upper"o"bracket").Crea una función llamada
processMessageque acepte unMessageFormattery una cadena de mensaje, y que después devuelva el resultado formateado. Esta función no necesita saber qué formateador específico recibe. Simplemente llama aformat()en cualquier objeto que se le pase.Según la entrada del tipo de formateador, crea el objeto de formateador adecuado. Pásalo a tu función
processMessagejunto con el mensaje e imprime el resultado.En una línea nueva, imprime qué categoría de patrón representa esta estructura. Como estamos definiendo comportamientos intercambiables mediante una interfaz, imprime:
Pattern category: Behavioral
Este desafío muestra cómo las interfaces te permiten intercambiar implementaciones sin cambiar el código que las utiliza: una base para patrones como Strategy que explorarás en las próximas lecciones.
Pruébalo tú mismo
<?php
require_once 'Formatters.php';
// Leer entrada
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Crea una función llamada processMessage que acepte un MessageFormatter
// y una cadena de mensaje, luego devuelve el resultado formateado
// TODO: Basado en $formatterType ("upper" o "bracket"), crea el formateador apropiado
// TODO: Llama a processMessage con el formateador y el mensaje, luego imprime el resultado
// TODO: Print the pattern category on a new line
// Format: "Pattern category: Behavioral"
?>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 la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online