Ліниве завантажування () — шаблон проєктування, який покликаний покращити продуктивність шляхом завантаження даних, не одразу, а на вимогу.

Опис При завантаженні даних зі сховища у пам'ять необхідно користуватись не тільки даними об'єкта, але і пов'язаних із ним сутностей. Якщо завантажувати усі об'єкти це погано вплине на продуктивність аплікації, особливо у випадках коли ці дані не потрібні.

Даний шаблон пропонує не завантажувати додаткові дані, коли в них немає потреби. Замість цього встановлюється маркер, що дані відсутні та при потребі можуть бути завантажені.

Протилежністю лінивому завантаженню являється жадібне.

Реалізація

Є чотири основних способи реалізації лінивого завантаження: лінива ініціалізація, віртуальний проксі, контейнер значення та привид. Кожний із цих підходів має свої переваги та недоліки.

Лінива ініціалізація

Даний підхід використовує спеціальний маркер для перевірки наявності даних. Часто як маркер може виступати нульовий вказівник — null. При звернені до даних перевіряється їх наявність та в разі відсутності відбувається завантаження даних зі сховища.

Віртуальний проксі

Даний підхід вимагає, щоб об'єкт приховувався за інтерфейсом. При звернені до об'єкта насправді відбуватиметься звернення до проксі, який завантажує дані та перенаправляє запит реальному об'єкту.

Цей підхід використовує фреймворк EntityFramework.

Контейнер значення

Необхідно створити обгортку для об'єкта, яка вміє завантажувати дані у пам'ять.

У мові C# даний шаблон реалізує клас Lazy.

Привид

Об'єкт не містить даних (або містить частково), а при першому звернені до нього завантажує себе зі сховища.

Див. також Лінива ініціалізація Проксі

Джерела Lazy Load