Заместитель (англ. Proxy) — структурный шаблон проектирования, предоставляет объект, который контролирует
доступ к другому объекту, перехватывая все вызовы (выполняет функцию контейнера).
Наиболее частым применением шаблона Прокси является ленивая загрузка (lazy load).
“Тяжелые” объекты не всегда разумно загружать в момент инициализации. Более правильным решением будет загрузить
его по первому требованию.
Представим нашу кухню(Kitchen).
У нас есть какой-то склад булок(Kitchen->muffinPool) для бургеров. Заказы идут - булки расходуются.
У нас есть контакты проверенного поставщика(MuffinForwarder), который снабжает нас булками. У поставщика так же есть
какое-то хранилище, и связь с фабрикой(MuffinFactory) которая производи булки.
В нашем примере Заместителей будет - два. Это кухня и поставщик.
Рассмотрим всю суть чуть ближе.
Фабрика(MuffinFactory) - просто производит булки. Вам нужна булка?
MuffinFactory->getProduct() отдаст вам новый объект типа Product.
Поставщик(MuffinForwarder) - имеет какое-то хранилище для булок.
MuffinForwarder->getProduct() отдаст вам объект типа Product из своего хранилища.
Как только булки заканчиваются, он обращается к Фабрике и делает закупку.
Кухня(Kitchen) - как и поставщик имеет хранилище.
Kitchen->getProduct() так же отдаст вам объект типа Product из своего хранилища.
Как только есть необходимость в булках мы обращаемся к поставщику.
А теперь давайте поймем зачем нам всё это нужно?
Если у поставщика есть булки, время их доставки на кухню занимает какое-то время. Например 10 минут.
Если у поставщика их нет, он заказывает их у фабрики. Производство одной занимает например 1 минуту.
Время это ресурс который потребляет наши объекты. И инициализация их нужна только по мере необходимости.
Данный шаблон очень похож на Декоратор. Что бы уловить суть представим что клиенту недоступна ни фабрика, ни поставщик.
Он просто-напросто не сможет получить продукт. Он знает что есть кухня и всё.