PATRONES DE DISEÑO
Los patrones de diseño son soluciones habituales a problemas comunes en el diseño
de software.
Patrones creacionales
Los patrones creacionales proporcionan varios mecanismos de creación de objetos que
incrementan la flexibilidad y la reutilización del código existente.
Abstract Factory
Permite producir familias de objetos relacionados sin especificar sus clases
concretas.
Builder Patterns
Permite construir objetos complejos paso a paso. El patrón nos permite producir
distintos tipos y representaciones de un objeto empleando el mismo código de
construcción.
Factory Method
Proporciona una interfaz para crear objetos en una superclase, mientras permite
a las subclases alterar el tipo de objetos que se crearán
Prototype
Permite copiar objetos existentes sin que el código dependa de sus clases
Singleton
Permite asegurarnos de que una clase tenga una única instancia, a la vez que
proporciona un punto de acceso global a dicha instancia.
Patrones estructurales
Explican cómo ensamblar objetos y clases en estructuras más grandes, a la vez que se
mantiene la flexibilidad y eficiencia de estas estructuras.
Adapter
Permite la colaboración entre objetos con interfaces incompatibles
Bridge
Permite dividir una clase grande, o un grupo de clases estrechamente
relacionadas,en dos jerarquías separadas (abstracción e implementación)
que pueden desarrollarse independientemente la una de la otra
Composite
Permite componer objetos en estructuras de árbol y trabajar con esas
estructuras como si fueran objetos individuales.
Decorator
Permite añadir funcionalidades a objetos colocando estos objetos dentro de
objetos encapsuladores especiales que contienen estas funcionalidades
Façade
Proporciona una interfaz simplificada a una biblioteca, un framework o cualquier
otro grupo complejo de clases.
Flyweight
Permite mantener más objetos dentro de la cantidad disponible de RAM
compartiendo las partes comunes del estado entre varios objetos en lugar
de mantener toda la información en cada objeto
Proxy
Permite proporcionar un sustituto o marcador de posición para otro objeto. Un
proxy controla el acceso al objeto original, permitiéndote hacer algo antes o
después de que la solicitud llegue al objeto original
Patrones de comportamiento
Los patrones de comportamiento tratan con algoritmos y la asignación de
responsabilidades entre objetos.
Chain of responsibility
Permite pasar solicitudes a lo largo de una cadena de manejadores. Al recibir
una solicitud, cada manejador decide si la procesa o si la pasa al siguiente
manejador de la cadena
Command
Convierte una solicitud en un objeto independiente que contiene toda la
información sobre la solicitud. Esta transformación te permite parametrizar los
métodos con diferentes solicitudes, retrasar o poner en cola la ejecución de una
solicitud y soportar operaciones que no se pueden realizar
Iterator
Permite recorrer elementos de una colección sin exponer su representación
subyacente (lista, pila, árbol, etc.)
Mediator
Permite reducir las dependencias caóticas entre objetos. El patrón restringe las
comunicaciones directas entre los objetos, forzándolos a colaborar únicamente a
través de un objeto mediador.
Memento
Permite guardar y restaurar el estado previo de un objeto sin revelar los detalles
de su implementación
Observer
Permite definir un mecanismo de suscripción para notificar a varios objetos
sobre cualquier evento que le suceda al objeto que están observando
State
Permite a un objeto alterar su comportamiento cuando su estado interno cambia.
Parece como si el objeto cambiara su clase
Strategy
Permite definir una familia de algoritmos, colocar cada uno de ellos en una clase
separada y hacer sus objetos intercambiables
Template method
Define el esqueleto de un algoritmo en la superclase pero permite que las
subclases sobrescriban pasos del algoritmo sin cambiar su estructura
Visitor
Permite separar algoritmos de los objetos sobre los que operan.
DIFERENCIAS ENTRE ABSTRACCIÓN Y ENCAPSULACIÓN
La abstracción oculta la complejidad para dar una imagen mas abstracta, mientras que
la encapsulación oculta el trabajo interno para que puedas cambiarlo posteriormente.
En otras palabras, la Abstracción oculta detalles a nivel de diseño, mientras que la
Encapsulación oculta detalles a nivel de implementación.
Las clases abstractas representan conceptos generales, engloban las características
comunes de un conjunto de objetos
POLIMORFISMO
Es la capacidad que tienen los objetos de una clase en ofrecer respuesta distinta e
independiente en función de los parámetros
Sobrecarga: El más conocido y se aplica cuando existen funciones con el
mismo nombre en clases que son completamente independientes una de la otra.
INTERFACES
La interfaz especifica el comportamiento común que tiene un conjunto de clases
ARRAYLIST VS LINKEDLIST
Funcionan de forma similar, pero la implementacion es diferente, arrayList se crea todo
en un solo bloque, linkedList agregra referencias a los elementos anteriores y
posteriores, en caso de
Para lectura arrayList saca el valor directamente sin importar el lgar que se encuentre,
linkendList debe recorrer toda la lista.
Para escritura o eliminar arrayList es mas lento ya que necesita sacar una copia de los
elementos que lo hace mas lento. LinkendList solo toma en cuenta las referencias de
los nodos.
Scope Bean en Spring
Scope Singleton en Spring
Este es el scope por defecto en Spring. Funciona de manera que todas las
peticiones que se hagan a ese bean siempre devuelven el mismo objeto, el cual se
encuentra cachead
@Scope("singleton")
Scope Prototype en Spring
En el caso en el que nuestro bean sea Prototype el contenedor de Inversión de Control
de Spring creará una nueva instancia del objeto cada vez que se realize una
petición para ese bean . Por lo general vamos a usar el Scope Prototype de Spring
cuando cuando deseamos mantener estado.
@Scope("prototype")
Scope Request en Spring
Scope Request es un tipo de Scope Bean en Spring, que crea un nuevo bean por
cada petición HTTP que se realize. Este tipo de bean puede ser utilizado para temas
de autenticación y autorización.
Scope Session en Spring
El Scope Session diferencia del request, creará un único bean para la sessión de
HTTP.
Scope Application en Spring
Este tipo de Scope Bean va a crear un bean para todo el ciclo de vida del
ServletContext. Es decir, crea una instancia por el tiempo de ejecución de la
aplicación.
Este Scope es parecido al Scope Singleton pero tiene una diferencia, el singleton
tienen un alcanze únicamente a un ApplicationContext, mientrás que el Application es
un scope de tipo singleton pero para ServletContext.
Scope WebSocket en Spring
El tipo de Scope WebSocket es un tipo especial en el que el bean que se crea
dura durante la sesión del WebSocket.
Este tipo se Scope es usado para crear aplicaciones con WebSocket, para intercambio
de mensajes por ejemplo, de manera bidireccional entre cliente y servidor. Este tipo de
Scope vivirá mientras la sesión del WebSocket este viva.
Broker de Mensajería : Kafka vs. RabbitMQ
Dos patrones de mensajería son los principales: Colas de mensajes (Queue) y
publicador-suscriptor (Pub-Sub).
Las colas de mensajes ofrecen la mejor oportunidad para escalar el procesamiento, la
desventaja principal es que no aceptan varios suscriptores en cada cola. El
publicador-suscriptor permite transmitir eventos de forma asíncrona sin necesidad de
emparejar los productores con los consumidores. También es capaz de difundir
mensajes a grupos de consumidores, pero la escalabilidad es más complicada.
Apache Kafka y RabbitMQ
¿Qué es el recolector de basura?
Garbage Collector es un programa que administra la memoria automáticamente,
en donde la desasignación de objetos es manejada por Java en lugar del
programador. En el lenguaje de programación Java, la asignación dinámica de
objetos se logra utilizando el nuevo operador. Un objeto una vez creado utiliza
algo de memoria y la memoria permanece asignada hasta que haya referencias
para el uso del objeto.
Cuando no hay referencias a un objeto, se supone que ya no es necesario, y la
memoria, ocupada por el objeto puede ser reclamada. No hay necesidad explícita
de destruir un objeto ya que Java maneja la desasignación automáticamente.