Отложенный вызов (упрощаем паттерн Заместитель)
Очень часто в процессе написания приложений в стиле ООП, возникает необходимость отложенного вызова. Что такое отложенный вызов? Это инстанцирование объекта, по мере необходимости. Своего рода, это упрощенная реализация паттерна "Proxy" (Заместитель)
Приведу несколько примеров. Допустим, мы используем в системе шаблонизатор smarty. В рамках главного контроллера, использование его выглядело бы следующим образом.

На данном этапе данная версия имеет место быть, однако, по мере усложнения кода конструктора: допустим нам надо создать 10 объектов, либо по мере появления методов использование которых не требует smarty (например, запись в базу и редирект), такой подход может вносить путаницу в код, и чрезмерное использование ресурсов, там где не надо.
Попробуем изменить наш код, так, чтобы можно было использовать отложенный вывод.
Таким образом, затратная операция инстанцирования смарти, нами будет выполнена едино кратно, и только по необходимости.

Добавим гибкости в наш код и приведем другой пример.
Допустим в какой-то момент, мы хотим отказаться от использования смарти, и заменить его более скоростным аналогом. При этом часть старых контроллеров наследных от MyMainController по прежнему используют старый шаблонизатор.
Нам требуется всего лишь добавить аксессор set:

Теперь, если установить извне новый шаблонизатор, он будет работать вместо старого, не теряя совместимости со старыми контроллерами наследными от главного. Естественно, классы Smarty и SuperSpeedSmarty должны иметь общий интерфейс.

