4.1 Constructor

Builder es un patrón de diseño generativo que proporciona una forma de crear un objeto compuesto.

Separa la construcción de un objeto complejo de su representación, de manera que un mismo proceso de construcción puede dar lugar a diferentes representaciones.

Constructor

Fortalezas:

  • le permite cambiar la representación interna del producto;
  • aísla el código que implementa la construcción y presentación;
  • proporciona un control más preciso sobre el proceso de diseño.

Lados débiles:

  • el algoritmo para crear un objeto complejo no debe depender de las partes de las que consta el objeto y cómo encajan entre sí;
  • el proceso de construcción debe proporcionar diferentes representaciones del objeto que se está construyendo.

Un buen ejemplo es la clase HttpRequest, que tiene una subclase HttpRequest.Builder que se puede usar para crear instancias de la clase HttpRequest y garantizar que sean válidas.

4.2 Inicialización diferida

La inicialización diferida es una técnica de programación en la que se realiza una operación que consume muchos recursos (creación de objetos, cálculo de valores) inmediatamente antes de utilizar su resultado.

Por lo tanto, la inicialización se realiza "bajo demanda" y no por adelantado. Una idea similar encuentra aplicación en una variedad de áreas: por ejemplo, la compilación sobre la marcha y el concepto de logística Just-in-Time.

Inicialización perezosa

Un caso especial de inicialización diferida (crear un objeto en el momento de acceder a él) es uno de los patrones de diseño generativo. Por lo general, se usa junto con patrones como Factory Method, Loner y Proxy.

Fortalezas:

  • La inicialización se realiza solo cuando es realmente necesaria;
  • La inicialización inicial de la aplicación se acelera: todo lo que se puede posponer se pospone.

Lados débiles:

  • No es posible establecer explícitamente el orden en que se inicializan los objetos;
  • Hay un retraso en el primer acceso al objeto, que puede ser crítico cuando se realiza en paralelo otra operación que consume muchos recursos. Debido a esto, es necesario considerar detenidamente la idoneidad de utilizar la inicialización diferida en sistemas de software multiproceso.

¿Recuerda cómo al escribir web.xml podía especificar el orden de inicio de los servlets allí? Este es exactamente el resultado de la carga diferida. Tomcat creará objetos de servlet la primera vez que se acceda a ellos.

4.3 Conjunto de objetos

Un conjunto de objetos es un patrón de diseño principal, un conjunto de objetos inicializados y listos para usar. Cuando el sistema necesita un objeto, no lo crea, sino que lo toma del grupo. Cuando ya no se necesita un objeto, no se destruye, sino que se devuelve a la piscina.

grupo de objetos

La agrupación de objetos se utiliza para mejorar el rendimiento cuando es costoso crear un objeto al comienzo de un trabajo y destruirlo al final. La mejora del rendimiento es especialmente notable cuando los objetos se crean y destruyen con frecuencia, pero solo existe una pequeña cantidad de ellos al mismo tiempo.

Un conjunto de objetos es útil cuando un objeto posee recursos distintos de la memoria, como los sockets de red. O si la colección de objetos ocupa una parte significativa de la memoria de la computadora y se crea mucha "basura".

Como recordará, Tomcat ejecuta cada solicitud en un hilo separado. Pero los hilos no se crean cada vez de nuevo, sino que se almacenan en el grupo de hilos. Esto permite una ejecución más rápida de las solicitudes: cuando se necesita un subproceso, simplemente se toma del grupo. Por cierto, la pregunta es: ¿cómo colocaría el subproceso en ejecución en el grupo y lo sacaría del grupo?