Introducción a los patrones de diseño
Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 89 de 110.
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 de una manera consistente y mantenible.
Piense en los patrones de diseño como si fueran recetas. Al igual que un chef no inventa una forma nueva de hacer pan cada vez, los programadores utilizan patrones que se han perfeccionado durante décadas. Estos patrones aprovechan los conceptos de OOP que ya ha aprendido —clases, herencia, interfaces y polimorfismo— y los combinan de maneras específicas para resolver problemas particulares.
Los patrones de diseño se agrupan típicamente 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 |
En las próximas lecciones, aprenderás patrones específicos de cada categoría. Cada patrón aborda un problema distinto: asegurar que solo exista una instancia de una clase, crear objetos sin especificar clases exactas o permitir que los objetos notifiquen a otros sobre cambios. Comprender cuándo y por qué usar cada patrón es tan importante como saber cómo implementarlo.
Desafío
Fácil¡Vamos a construir un sistema simple de resolución de problemas que demuestre cómo los patrones de diseño organizan el código por categorías! Crearás una estructura que clasifica diferentes desafíos de software y sugiere qué tipo de patrón podría ayudar a resolverlos.
Organizarás tu código en dos archivos:
patterns.dart: Crea un enum llamadoPatternCategorycon tres valores:creational,structural, ybehavioral. Cada uno debe tener un campoString descriptionque explique su propósito:creational: "Handles object creation"structural: "Handles object composition"behavioral: "Handles object communication"
Problemque represente un desafío de software. Debe tener un campoString namey un campoPatternCategory category. Incluye un métodosuggest()que devuelva una cadena con el formato:[name] -> Use a [category description] patternmain.dart: Importa tu archivo de patrones y demuestra cómo diferentes problemas se mapean a diferentes categorías de patrones. Crea tres instancias deProblem:- Un problema llamado
Ensure single database connectioncon la categoríacreational - Un problema llamado
Make old API work with new systemcon la categoríastructural - Un problema llamado
Notify users when data changescon la categoríabehavioral
suggest()en cada problema e imprime los resultados.- Un problema llamado
¡Este desafío te ayuda a ver cómo se categorizan los patrones de diseño según el tipo de problema que resuelven, un concepto clave a medida que comienzas a aprender patrones específicos en las próximas lecciones!
Salida esperada:
Ensure single database connection -> Use a Handles object creation pattern
Make old API work with new system -> Use a Handles object composition pattern
Notify users when data changes -> Use a Handles object communication patternHoja de referencia
Los patrones de diseño son soluciones probadas a problemas comunes de programación. Son plantillas que combinan conceptos de POO (clases, herencia, interfaces, polimorfismo) de maneras específicas.
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 |
Pruébalo tú mismo
import 'patterns.dart';
void main() {
// TODO: Crea tres instancias de Problem:
// 1. name: "Ensure single database connection", category: creational
// 2. name: "Make old API work with new system", category: structural
// 3. name: "Notify users when data changes", category: behavioral
// TODO: Llama a suggest() en cada problema e imprime los resultados
}
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 POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository