CREATIONAL- Singleton
un tipo soltero se sube a un unicornio unicornio y hace que un grupo de unicornios con Evita peron encima se unifique en el suyo y termina cabalgando hacia una tabla de una base de datos
CREATIONAL- Prototype
el del juego prototype se le cae dinero y cierra una fábrica de personajes iguales a él y comienza a largar clones, despues juega a la play
- ¿Qué es?
Permite crear nuevos objetos copiando o clonando una instancia existente, en lugar de crear una desde cero. Este patrón utiliza un prototipo como plantilla para generar objetos similares sin necesidad de conocer sus detalles de implementación.
- ¿Cuándo aplicarlo?
Úsalo cuando la creación de objetos desde cero sea costosa o compleja y ya tengas un objeto base que puede servir como modelo. Es ideal para sistemas donde los objetos comparten características similares y deben generarse de forma eficiente, como juegos o sistemas gráficos.
CREATIONAL- Builder/Constructor
bob el constructor construye paso a paso un robot que tiene muchas configuraciones de botones y muchos paraguas, despues se pone unos anteojos y lo lee
- - - ¿Qué es?
Divide el proceso de construcción de un objeto complejo en una serie de pasos o métodos, proporcionando control sobre cómo se ensamblan sus partes. Esto permite crear diferentes representaciones del objeto sin cambiar su estructura interna.
- ¿Cuándo aplicarlo?
Úsalo cuando un objeto tenga **muchas configuraciones opcionales o diferentes combinaciones de parámetros, **como al construir un objeto JSON complejo, configuraciones de interfaz de usuario o estructuras de datos con múltiples variantes. Es especialmente útil para mejorar la legibilidad del código y reducir constructores demasiado cargados.
Ejemplo: Construir un objeto “Usuario” paso a paso.
CREATIONAL- Abstract Factory
en una fabrica fantasma hay familias de objetos, como teteras, el fantasma las mete en una capsula y las agrupa en un el inter de miami con un general
- - ¿Qué es?
Es un patrón que proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas. Este patrón encapsula las fábricas individuales bajo una interfaz más general.
- ¿Cuándo aplicarlo?
Úsalo cuando trabajes con sistemas que requieran múltiples tipos de objetos relacionados y quieras asegurar la coherencia entre ellos, como al conectar a multiples bases de datos o desarrollo multiplataforma, o en GUI
Ejemplo: Crear familias de botones y cuadros de diálogo para diferentes plataformas.
CREATIONAL- Factory
una fabrica a la que le entran pedidos como “toyota”,”corolla”,”rojo” y “ford,f100,azul” y salen del otro lado los vehiculos sin que se vea nada dentro de la fabrica
- - ¿Qué es?
Proporciona un método para crear objetos sin especificar la clase concreta del objeto que se va a crear. Centraliza la lógica de creación en una única ubicación, lo que hace que el código sea más modular y flexible.
- ¿Cuándo aplicarlo?
Úsalo cuando necesites delegar la creación de objetos complejos o cuando quieras mantener bajo acoplamiento en tu código. Es útil en sistemas donde las clases específicas del objeto no son conocidas hasta el momento de la ejecución, como al implementar sistemas de plugins o trabajar con datos dinámicos.
Ejemplo: Una fábrica que devuelve instancias según un tipo dado.
ESTRUCTURAL - Facade FASAD
en la fachada de un local se oculta todo el funcionamiento del negocio y sólo haces los pedidos - despues de pedirle una pizza miras el calendario y la fecha de hoy
GameEngine que expone un método startGame(), combinando la lógica de inicialización de todos estos módulos.ESTRUCTURAL - Bridge
un puente une a un fantasma y a un invertido suplemento deportivo
Patrón Bridge (Puente) – Explicación Sencilla
El patrón Bridge es un patrón de diseño estructural que te ayuda a dividir una clase grande o un grupo de clases relacionadas en dos partes principales:
1. Abstracción: Lo que define qué hace algo (su función general).
2. Implementación: Cómo hace eso (los detalles técnicos específicos).
Estas dos partes pueden desarrollarse y modificarse de forma independiente. Este patrón se llama “Bridge” porque conecta (o actúa como puente entre) la abstracción y la implementación, permitiendo que ambas evolucionen sin depender una de la otra.
Ventajas del Patrón Bridge
- Separación de responsabilidades: La abstracción y la implementación están claramente separadas, lo que facilita la lectura y mantenimiento del código.
- Flexibilidad: Permite cambiar cómo funciona algo sin afectar al resto del sistema.
- Evita diseños rígidos y complicados: Reduce la posibilidad de crear estructuras de clases difíciles de modificar.
Cuándo Usar el Patrón Bridge
ESTRUCTURAL - Composite
en un compost hay un arbol que tiene ramas y despues hojas
```typescript
menu.add(salad); // Añade un platillo.
menu.add(compositeMenu); // Añade un grupo de platillos.
menu.display(); // Muestra todos los elementos.
~~~
ESTRUCTURAL - Decorator
hay un decorador EXTIENDE su brazo y decora con cosas de navidad un mueble sin modificar su estructura base
- ¿Qué es?
Permite agregar comportamiento o responsabilidades adicionales a un objeto de forma dinámica sin modificar su estructura base.
- ¿Cuándo aplicarlo?
Úsalo cuando necesites **extender la funcionalidad **de clases sin herencia, como al añadir características dinámicas a componentes visuales o procesos.
- Ejemplo (texto):
Un servicio de notificaciones donde puedes decorar un mensaje base con funcionalidades adicionales como encriptación o registro.
```typescript
const notification = new EncryptedDecorator(new BaseNotification());
notification.send(); // Envía el mensaje con cifrado adicional.
~~~
ESTRUCTURAL - Adapter
hay un adaptador de electricidad que traduce de un idioma al otro entre dos personas de clases diferentes. uno es extranjero.
tambien funciona al traducirle a ancianos
El patrón Adapter es un patrón de diseño que permite que una clase existente se comunique con otra que tiene una interfaz incompatible. En lugar de modificar el código original, se crea un “adaptador” que actúa como un traductor entre ambas.
Este patrón es útil cuando necesitas que dos partes de un sistema trabajen juntas, pero sus interfaces no son compatibles.
Cuándo Usar el Patrón Adapter
BEHAVIORAL - Observer
hay unos tipos observando como se suscriben a netflix y cuando sube una pelicula les aparece directamente en el celular, tienen puestas remeras de VUE
- ¿Qué es?
Define una relación uno a muchos, donde múltiples objetos (suscriptores) se actualizan automáticamente cuando un objeto (sujeto) cambia de estado.
- ¿Cuándo aplicarlo?
Úsalo para implementar sistemas de eventos o notificaciones, como actualizaciones en tiempo real en interfaces de usuario o sistemas de publicación/suscripción.
- Ejemplo (texto):
Un objeto de stock de productos notifica a los usuarios cuando hay cambios en el inventario.
```typescript
stock.subscribe(userObserver);
stock.notify(); // Informa a todos los observadores del cambio.
~~~
BEHAVIORAL - Iterator
estas iterando un objeto y de golpe estas corriendo sobre las ramas de un arbol y aparecen graficos volando y el piso se convierte en una lista de tareas
- ¿Qué es?
Proporciona una forma de acceder secuencialmente a los elementos de una colección sin exponer su implementación interna.
- ¿Cuándo aplicarlo?
Úsalo cuando necesites recorrer estructuras de datos complejas, como listas, árboles o gráficos, de manera uniforme.
- Ejemplo (texto):
Un iterador para una lista de reproducción que permite reproducir canciones una a una.
```typescript
while (playlist.hasNext()) {
console.log(playlist.next().title); // Imprime los títulos de las canciones.
}
~~~
BEHAVIORAL - Template Method
hay un templario haciendo templates de torneos de vue y despues se pone a preparar bebidas como té y café
- - ¿Qué es?
Define el esqueleto de un algoritmo en un método base y permite que las subclases implementen pasos específicos sin alterar su estructura general.
- ¿Cuándo aplicarlo?
Úsalo cuando varios algoritmos tengan la misma estructura general pero detalles diferentes, como en sistemas de procesamiento de datos o flujos de trabajo.
- Ejemplo (texto):
Un proceso de preparación de bebidas que varía según el tipo (café, té).
```typescript
tea.prepare(); // Llama al método base con pasos específicos de té.
~~~
BEHAVIORAL - Chain of Responsibility
hay una cadena y ant man va corriendo con una solicitud hasta que cae en un eslabón que lo procesa onda procesadora
- - ¿Qué es?
Permite que varias clases manejen una solicitud, pasándola a lo largo de una cadena hasta que alguien la procese.
- ¿Cuándo aplicarlo?
Úsalo para evitar el acoplamiento directo entre emisores y receptores de solicitudes, como en sistemas de autorización o validación de datos.
- Ejemplo (texto):
Un sistema de soporte técnico donde las solicitudes pasan por niveles (soporte básico, técnico, especialista).
```typescript
handler.setNext(specialistHandler);
handler.handleRequest(request); // Se procesa en el nivel adecuado.
~~~
TypeScript permite herencia multiple?
¿Qué es la notación Big O en JavaScript?
La notación Big O describe cómo escala el tiempo de ejecución o uso de memoria de un algoritmo a medida que aumenta el tamaño de la entrada (n). Se utiliza para medir la eficiencia de un algoritmo y predecir su comportamiento en escenarios grandes.
📊 Tipos Comunes de Big O:
🧠 Recuerda:
Big O no mide la velocidad exacta sino cómo escala el algoritmo cuando los datos crecen. Un algoritmo eficiente con una entrada pequeña podría volverse ineficiente con una entrada grande.
¿Por qué es importante?
Ayuda a elegir el algoritmo más eficiente para resolver problemas complejos en JavaScript y otros lenguajes.
Composicion vs Herencia
📚 Composición vs Herencia en TypeScript 📚
1️⃣ ¿Qué es la Herencia?
La herencia permite crear una nueva clase que hereda propiedades y métodos de una clase base. Se utiliza para modelar una relación “es un” (is-a).
🔹 Ventajas:
- Reutilización de código.
- Define relaciones jerárquicas claras.
- Útil cuando existe una relación directa entre clases.
🔸 Desventajas:
- Puede llevar a sistemas rígidos y difíciles de modificar.
- Cambios en la clase base pueden afectar a todas las clases derivadas.
- Dificulta la reutilización en contextos diferentes a la jerarquía.
Ejemplo Conceptual de Herencia:
Un “Coche” es un tipo de “Vehículo”:
Coche hereda de Vehículo porque es un vehículo.```text
Vehículo
└── Coche
~~~
2️⃣ ¿Qué es la Composición?
La composición es una técnica en la que una clase está compuesta por una o más clases, modelando una relación “tiene un” (has-a).
🔹 Ventajas:
- Mayor flexibilidad y modularidad.
- Favorece el principio de Composición sobre Herencia.
- Cambios en una clase no afectan a otras, siempre que se mantengan las interfaces.
🔸 Desventajas:
- Requiere más planificación inicial.
- Puede llevar a código más complejo cuando se abusa de ella.
Ejemplo Conceptual de Composición:
Un “Coche” tiene un motor, pero el motor puede ser reutilizado en otros contextos.
```text
Coche
└── Motor (componente)
~~~
🆚 Composición vs Herencia: Comparación
🚦 ¿Cuándo Usar Cada Uno?
💡 Recomendación:
Sigue el principio de “Composición sobre Herencia” siempre que sea posible, ya que mejora la flexibilidad y modularidad del código en TypeScript.
Aspecto | Herencia | Composición |
|———————-|————————————–|——————————————-|
| Relación | “Es un” (is-a) | “Tiene un” (has-a) |
| Acoplamiento | Alto acoplamiento | Bajo acoplamiento |
| Reutilización | Difícil fuera de la jerarquía | Alta, reutilizable en diferentes contextos|
| Flexibilidad | Rígida | Alta flexibilidad |
| Mantenimiento | Difícil si la jerarquía es profunda | Más fácil de mantener |