There are four common ways of implementing the lazy load design pattern:
- Lazy initialization (synonym for Lazy instantiation)
- Virtual proxy
- Ghost
- Value holder
1. Lazy initialization
Чак когато инстанция на даден обект ни потрябва, тогава го инстанцираме.
2. Virtual proxy
Virtual Proxy is an object with the same interface as the real object. The first time one of its methods are called it loads the real object and then delegates.
Създаваме 2 обекта, от 2 отделни класа, имплементиращи 1 общ интерфейс.
Когато извикаме някой метод от ПЪРВИЯ обект, той създава обект от ВТОРИЯ клас, присвоява го на пропърти от ПЪРВИЯТ, и ОТ ТУК НАТАТЪК каквото искаме да достъпим от ВТОРИЯ, викаме („минаваме“) през ПЪРВИЯ.
A virtual proxy object shares an interface with the „real“ object. The first time a property of the virtual proxy is accessed, the real object gets initialized. From that point on, accessing properties of the virtual object returns the corresponding property of the real object.
Явно идеята е ако оригиналният обект е ресурсоемък или времеемък, но трябва да го инициализираме по една или друга причина, да не го инициализираме него, а някакъв друг, виртуален, който има същият интерфейс, и чак когато ни трябва оригиналът, тогава във виртуалният създаваме оригиналният, и с делегиране го използваме (delegation).
3. Ghost
A „ghost“ is the object that is to be loaded in a partial state. It may only contain the object’s identifier, but it loads its own data the first time one of its properties is accessed. For example, consider that a user is about to request content via an online form. At the time of creation all we know is that content will be accessed but what action or content is unknown.
A ghost is the real object without any data. The first time you call a method the ghost loads the full data into its fields.
Или с други думи, създаваме обект но съвсем опростен с идеята в последвие да добавяме към него повече данни. Добър пример би бил, ако първо създадем някакъв „полупразен“ обект, в който ще съхраняваме и обработваме информация от събмитната HTML форма, но го „пълним“ след събмитване.
$userData = array( "UID" = > uniqid(), "requestTime" => microtime(true), "dataType" => "", "request" => "" ); if (isset($ _POST['data']) && $userData) { // … }
4. Value holder
Basically, а value holder is a generic object that handles the lazy loading behavior and appears in place of the object’s data fields. When the user needs to access it, they simply ask the value holder for its value by calling the GetValue method. At that time (and only then), the value gets loaded from a database or from a service (this is not always needed).
Най просто, идеята е когато имаме нужда от дадено пропърти на даден обект, и това е свързано с ресурсоемка или времеемка операция (извличане от БД например), това извличане да стане чак тогава, през даден гетър например, в който например може да има допълнителна логика, която да запази тази информация в статично пропърти, за да не се извлича всеки път.
public function getValue($parameter) { if (self::$value == null) { self::$value = valueRetrieval($parameter); } return self::$value; }
Литература:
https://en.wikipedia.org/wiki/Lazy_loading