Lazy loading
# Lazy loading

La carga diferida (en inglés lazy loading) es un patrón de diseño comúnmente usado en la programación informática que consiste en retrasar la carga o inicialización de un objeto hasta el mismo momento de su utilización. Esto contribuye a la eficiencia de los programas, evitando la precarga de objetos que podrían no llegar a utilizarse. El opuesto de la carga diferida es la carga previa, precarga o eager loading.

## Implementaciones

Existen cuatro formas comunes de implementar la carga diferida: lazy initialization; virtual proxy; ghost y value holder. Cada uno tiene sus propias ventajas y desventajas.

### Inicialización diferida

Con inicialización diferida, el objeto a ser cargado de manera diferida es originalmente asignado como un valor nulo y cada petición para el objeto verifica si es nulo y lo crea "sobre la marcha" antes de devolverlo, como puede verse en este ejemplo escrito en C#:

O con el operador coalescente para nulidad '??'

Este método es el más sencillo de implementar, sin embargo, si nulo es un valor legítimo, puede hacerse necesario usa un objeto como placeholder para indicar que no ha sido inicializado.

### Proxy virtual

Es un objeto con la misma interfaz que el objeto real. La primera vez que su método es llamado carga el objeto real y lo delega.

### Fantasma

Un "fantasma" es el objeto que se quiere cargar en un estado parcial. Pues solo contener el identificador del objeto, pero carga sus propios datos desde la primera vez que una de sus propiedades sea accedida. Por ejemplo, considere que el usuario está a punto de hacer una petición de contenido desde un formulario en línea. Al momento de la creación todo lo que sabemos es que se accederá a cierto contenido, pero que cómo o a qué contenido se desconoce aún. Ejemplo con PHP:

### Contenedor de Valor

Un Contenedor de Valor es un objeto genérico que se encarga del comportamiento de la inicialización diferida y aparece en lugar de los campos del objeto:

