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 probadas a 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.
Piense en los patrones de diseño como recetas. Al igual que un chef sigue una receta para crear un plato que se ha perfeccionado con el tiempo, los desarrolladores utilizan patrones de diseño para estructurar su código de maneras que han sido probadas y refinadas por innumerables programadores antes que ellos.
Los patrones de diseño se agrupan típicamente 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 |
De hecho, 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, te estabas preparando para el patrón Strategy.
Aprender patrones de diseño te brinda 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ácilVamos a construir un sistema de formateo de mensajes sencillo que demuestre cómo los patrones de diseño ayudan a organizar el código. Identificarás a qué categoría de patrón pertenece cada componente y verás cómo trabajan juntas las diferentes partes de un sistema.
Organizarás tu código en tres archivos:
MessageFormatter.php— Crea una interfaz llamadaMessageFormatterque defina un contrato para formatear mensajes. Debe tener un único métodoformat(string $message): string. Esto representa la categoría behavioral (de comportamiento): define cómo se comunican los objetos y cómo 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úsculas.BracketFormatter— 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 luego 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.Basándote en la entrada del tipo de formateador, crea el objeto formateador apropiado. Pásalo a tu función
processMessagejunto con el mensaje e imprime el resultado.En una nueva línea, imprime qué categoría de patrón representa esta estructura. Dado que estamos definiendo comportamientos intercambiables a través de 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.
Hoja de referencia
Los patrones de diseño son soluciones probadas a problemas comunes de programación que proporcionan plantillas para estructurar el código de manera efectiva.
Los patrones de diseño se agrupan en tres categorías:
| Categoría | Propósito | Ejemplos |
|---|---|---|
| Creacionales | Cómo se crean los objetos | Singleton, Factory |
| Estructurales | Cómo se componen los objetos | Adapter, Decorator |
| De comportamiento | Cómo se comunican los objetos | Observer, Strategy |
Los patrones de diseño proporcionan un vocabulario compartido entre los desarrolladores, lo que facilita la comunicación de decisiones arquitectónicas complejas.
Pruébalo tú mismo
<?php
require_once 'Formatters.php';
// Leer entrada
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Crear una función llamada processMessage que acepte un MessageFormatter
// y una cadena de mensaje, luego devuelva el resultado formateado
// TODO: Basado en $formatterType ("upper" o "bracket"), crear el formateador apropiado
// TODO: Llamar a processMessage con el formateador y el mensaje, luego imprimir el resultado
// TODO: Imprimir la categoría del patrón en una nueva línea
// Formato: "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 OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - 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 __unserializeResumen - 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)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy