Шаблон проектирования ► [ Пул объектов (object pool) ] Урок №15
Vložit
- čas přidán 28. 08. 2024
- Объектный пул (Пул объектов, object pool) - достаточно противоречивый шаблон проектирования. Прост в реализации и понимании, но сложно привести реально полезный пример из жизни.
#шаблоны_проектирования #objectpool #объектный_пул
*
★ Автор: Дмитрий Афанасьев.
★ Канал: clck.ru/JVYct
*
► Выразить благодарность, поддержать донатом развитие канала.
www.donational...
*
► Еще интересные курсы:
★ Видеокурс по Laravel: clck.ru/JVYa2
★ Видеокурс по Git: clck.ru/JVYYm
★ Объяснение SOLID: clck.ru/JVYXq
★ Шаблоны проектирования: clck.ru/JVYX7
★★★ Все курсы → clck.ru/JVYVd
⚝⚝⚝ Покровители канала:
► Константин [ ⚝⚝ Меценат ]
: "Спасибо за отличные уроки по Laravel";
: "Материал такого уровня можно смело продавать, а вы дарите бесплатно. Не могу пройти мимо и не поддержать ещё раз";
.
► jg77merten: "Добрый день. Код реализации шаблонов скиньте плз на ******@****.** Спасибо"
.
► Сергей: "Спасиб за ларку"
.
► Дима Кухта: "Спасибо за твои уроки. Отдельное спасибо за пример реализации архитектуры и разделение логики. Занимаюсь разработкой для android и привык разбивать логику на много слоев, а в ларавел нигде еще не видел примеры такие. Можно полностью ссылку на репозиторий, со всеми исходниками...."
.
► Канат Харасаев: "Хорошие курсы ! Хотелось видео по юнит тестированию"
.
► StefanTheBlade: "Ждем продолжения уроков, спасибо!"
.
► Константин Толмачев: "С наступающим Вас! Спасибо за вашк работу. Жду каждый ваш ролик. Только Вы смогли объяснить так, чтобы я понял)"
.
► Алексей Иванов: "Дмитрий, спасибо за уроки по ларавель."
.
► Алексей: "Спасибо за объяснение сложных вещей простыми словами и подкрепляя дельными примерами. Смотрю записи по Шаблонам проектирования, посмотрел SOLID."
.
► Аноним: "Обещанные с ЗП донат ))) Спасибо за уроки! Поправляйся!"
.
► DenisG: "Дмитрий, большое спасибо за отличные уроки по Ларавелю, шаблонам, солиду итд!"
.
► Константин: "обожечки BibleThump"
.
► Константин: "Пеши исчо LUL"
.
► Volodymyr Afanasiev: "odTrail BloodTrail BloodTrail"
.
► Volodymyr Afanasiev: "odTrail BloodTrail"
.
► Volodymyr Afanasiev: "odTrail"
.
► Valentin Knoll: "Laravel"
.
► Jaan Pajusalu: "Дмитрий! не забрасывай канал! ждем новых серий по Laravel"
.
► Konstantin: "Благодарю за уроки по laravel"
.
► DMITRII NAZIMOV: "Спасибо за курс по Laravel, Вы супер!"
.
► Jaan Pajusalu: "Спасибо за видео курс по Laravel."
.
► Alexander: "Спасибо за курсы! Ждем VUE + NUXT"
.
► zxc76: Laravel bleat"
.
► Валерий tao309: "Огромное спасибо за курс Laravel и остальные полезные видео!!!!"
.
► Ярослав: "Отправь пожалуйста исходники к видео Паттерн проектирования ►[ Канал событий (event channel) ] ► Урок #3. P.S. Уроки бомба, с большим удовольствием изучаю все видео. Email:***"
.
► Александр Корчак: "Спасибо, Дмитрий. Очень интересный курс"
.
► Tom Alex (Александр): "Дмитрий, спасибо за ваш труд. Надеюсь вы не забросите этот курс. По мере изучения буду вас поддерживать."
.
► Артём: "Привет! Крутые очень курсы) Такие за платно нужно толкать. Можешь пожалуйста скинуть исходник из видео №40, перед обсервером. ..."
.
► Aleksandr Oleshko: "Спасибо, мужик!"
.
► Snoopy: "Привет, кинул бы больше, но кидаю сколько могу т.к. я пока безработная херня) Спасибо за разжовку паттернов и курс ларки, по документации читать впервые - не очень понятно,а большинство курсов х**та полнейшая. Твой курс исключение. ..."
.
► Jaroslav
.
► EVGENIJ GLECHIKOV: "zf2 laravel"
.
► Алексей Пустоутов: "Хотелось бы шаблон Стратегия))) Писал пару раз в комментах. Спасибо вам"
.
► Аким: "Дмитрий, привет! Спасибо огромное за крутой курс по Laravel, весь еще не прошел. Вопрос: есть форма загрузки csv...";
.
► Александр Дера: "...И теперь у меня к вам вопрос: занимаетесь ли вы менторством? Если да, то свяжитесь со мной удобным для вас способом. VK, facebook...";
.
► Mordwin: "Спасибо за контент. Устроюсь на нормальную работу - подкину больше)";
.
► Александр Мельник: "Вы снимаете классные уроки, спасибо.";
.
► Дмитрий: "На кусочек провода для нового света :) Огромное спасибо за laravel курс! Помимо всего полезного оч порадовало то, что видео не сухие, есть какие-то отступления, шутки. Но… Я поленился и сам закодил далеко не всё. Хотелось бы получить последние исходники (Laravel, урок №50). Email ****"
.
► Алексей Сукач: "Спасибо за уроки. Надеюсь, не забросишь)"
.
► Lavr: "Большое спасибо за канал!"
.
► Павел Пожетнов
.
► Александр: "С нетерпением жду продолжения!!!";
.
► Алексей Украинцев: "Спасибо за курс жду продолжения, особенно на тему пользовательских ролей";
.
► Александр: "Дмитрий не бросайте начатое! Большое спасибо за то что вы уже сделали! ИМХО отличная подача материала и разъяснения. Буду ждать продолжения.";
.
► Николай Савин: "Спасибо за знания";
.
► Аноним: "Спасибо за курс, особенно нравится материал про архитектуру приложения.";
.
► Yoyshinoda: "Спасибо за видеокурс по Laravel ( уже появилось желание просмотреть другие). Благодаря этому курсу очень легко ощущаю себя в переходе с C++/C# (Пара-тройка лет в коммерческих проектах) на php. Из пожеланий, с удовольствием, бы просмотрел некий ваш личный топ литературы по этому делу";
.
► Аноним: "Для поднятия настроения";
.
► NGL Biathlon: Большое спасибо за курсы!";
.
► Иван
.
► Tetragrammaton: "Дмитрий, спасибо за вашу работу.";
.
► Oleg Yurchenko: "Спасибо! Пили видосы чаще! SeriousSloth";
.
► Аноним: "Хотелось бы чтобы почаще видео были";
.
► Дмитрий Лейко: "Спасибо за уроки!!! Удачи!";
.
► Andrew: "На пиуко) P.S. Спасибо за крутой курс!";
.
► Виталий Котов: "Привет! Спасибо за видео, но к сожалению застрял в самом начале, не могу двигаться дальше, интернет перерыл, но по английски я не очень(что бы читать форумы), а по русски не нашел ничего, а что нашел, то не работает. Ответь пожалуйста на мой вопрос..";
.
► Паша Гудман: "Не так давно наткнулся на ваш канал с целью грамотного подхода к изучению Laravel и, в целом, процесса разработки. Спасибо за то, что вы делаете. Удачи в вашем деле.";
.
► Ярослав;
.
► Дмитрий: "Спасибо за уроки, смотрю параллельно еще курс, такой нудный в отличие от твоего, так держать"
;
.
► Руслан Васильчиков: "Наконец-то я продвинулся дальше миграций в изучении Laravel. ** * как-то не зашел ;)"
;
.
► Александр;
.
► Бахтиёр
;
.
Спасибо за поддержку, друзья!;
Красавчик! Ты доносишь материал понятно и увлекательно! Это самое важное в преподавании!
Благодарю!
Большое спасибо, что не бросаете Вашу просветительскую деятельность!
Самый элементарный пример object pool когда допустим в игре используешь автомат из него постоянно генерируются патроны при стрельбе и затем после столкновения с объектом уничтожаются
Спасибо !)
Этот патерн очень полезен в играх, когда тебе нужно создавать сложные объекты в сцене, которые так же уничтожаются. Типа игра про машинки ты появляешься едешь тебя разбивают и что бы не создавать разрушенную машинку мы берём её из пула, и тебя же после смерти, твою целую тачку, суём в пул пока ты не не нажмёшь кнопку продолжить
И ещё, это скорее поведенческий патерн, а не порождающий
По сути паттерн реализует Создание объекта в целом, и конкретно в твоём примере - с оттенком поведения.
Dmitry Afanasyev создание объектов у меня происходит там заведомо до старта основного цикла. То есть я в потоке не трогаю пул, я беру только из пула объекты и меняю им свойства такие как позиция
Использую у себя в проекте, где при запуске приложения создаётся пул объектов с операциями подключенных модулей, допустим есть 3 модуля для работы с сторонними сервисами, мы можем их включать и выключать, у каждого модуля внутри имеется бизнес операция для работы с данными, при запуске приложения лоадер смотрит какие модули включенны и создаёт класс с пулом операций внутри, мы можем доставать эти операции по имени из любой точки кода если данный модуль включен, очень удобно...
Круто! Жду не дождусь декоратора!
Почему сложно придумать пример из жизни ? Дорожка для боулинга, бросаемые тобой шары сами прикатываются к тебе на старт и ждут пока ты их снова бросишь. И тебе не нужно каждый раз ходить за новыми шарамы, при том что именно те шары которые ты выбрал в начале остаются у тебя в податчике шаков пока ты их не поменяешь. Правда шары для боулинга ты не будешь очень часто бросать, но основной принцип сохраняется.
Не понятно. Боулинг - это пример из жизни?
Спасибо большое за твои видео
Какую задачу решаем?
Объединение объектов в пул может обеспечить значительный прирост производительности; он наиболее эффективен в ситуациях, когда стоимость инициализации экземпляра класса высока, скорость создания экземпляра класса высока, а количество экземпляров, используемых в любой момент времени, невелико.
Пулы объектов (иначе называемые пулами ресурсов) используются для управления кэшированием объектов. Клиент, имеющий доступ к пулу объектов, может избежать создания новых объектов, просто запросив у пула уже созданный экземпляр. Как правило, пул будет растущим пулом, т.е. пул сам будет создавать новые объекты, если пул пуст, или у нас может быть пул, который ограничивает количество создаваемых объектов.
Пример для понимания:
Шаблон пула объектов аналогичен офисному складу. При приеме на работу нового сотрудника офис-менеджер должен подготовить для него рабочее место. Она прикидывает, есть ли запасное оборудование на офисном складе. Если да, то она использует его. Если нет, она размещает заказ на покупку нового оборудования у Amazon. В случае увольнения работника его оборудование перемещается на склад, откуда его можно будет забрать, когда потребуется новое рабочее место.
В дополнение к вашему, где именно, и зачем используется данный паттерн
видео, где больше о том, как реально используется: czcams.com/video/nTbC5ZOKPCs/video.html
видео, более родное для PHP: czcams.com/video/Ax_mSvadFp8/video.html
+ сам паттерн выигрывает только тогда, когда приложение живет намного дольше, чем просто request->response
он по ощущениям уже для опытной аудитории(всякие отдельные демоны, очереди задач и т.д)
18:13 Передаем в метод для получения объекта из пула новый объект класса, чтобы тратить ресурсы на создание нового объекта. 😄
Спасибо, интересно)
Пул клонов ( кешируемых объектов). Это для игр - супер оптимизация). На юнити можно клонировать объект и потом на плодить клонов из кода, примерно тоже самое.
Клонировать и после использования удалить оригинал, или же создать метод очистки объекта
супер видосы !
Если не ошибаюсь это сильно смахивает на пул коннектов к базе в яве. Сам не ява программист но сталкивался с похожим подходом.
Суть там в том что ява набирает скажем 200 коннектов к базе и выдаёт их по необходимости и в воне восполняет. Что бы не тратить время на создание подключения в момент запроса.
Очень странная реализация. По сути та же фабрика прототипов, но тут не дает склонировать второй раз объект, пока первый активный. Да и клонирование ведь тоже нагружает.
По идее должно быть так. В начале создаются все объекты, и они добавляются в массив очередей этих объектов с ключом типа объекта. То есть у нас может быть ключ user с очередью (список первый вошел первый вышел) из 10 объектов юзеров. Когда мы берем объект из пула, берется первый. Когда его надо деактивировать, он ложится обратно в пул последним элементом.
На php тоже не могу понять где использовать этот паттерн. На C# в Unity использовал его для получения игровых объектов. В коментах видел пример с автоматом и патронами. Когда стреляешь, берется первый объект. Пуля улетает, и возвращается в очередь. Создается ощущение, что пули бесконечные, но на самом деле их может быть 10 штук, которые просто по кругу гоняются.
Извините, что не по теме) Видела на вашем канале видео по cms October и хотела бы узнать ваше мнение, 1) Можно ли эту cms использовать как альтернативу Wordpress или это разные вещи? 2) Для каких задач cms October не годится? Что можно сделать на Wordpress и нельзя на October или наоборот? 3) Насколько она востребована на фрилансе? Спасибо)
Спасибо за видео, может быть этот шаблон кто-то использует при асинхронном программировании (swoole и все такое) чтобы один раз определить базовые объекты, которые не изменятся и не тратить ресурсы на их создание, или подгрузку для каждого запроса
Как пример, когда-то реализовывал этот паттерн, хотя и не догадывался об этом. Правда я реализовал как раз клоаку, ну то от неопытности.
Суть решаемой проблемы была в следующем.
Частенько приходилось делать темы для WP, и был повторяющийся код. Сначала в плагины выносил. а потом столкнулся с зависимостями, когда тему поставил, а плагин забыл. И плюс где-то надо было допилить функционал и не сломать остальные темы, короче гемор. Потому принял решение делать вместо плагинов модули.
И вот получается у меня был отдельный класс МодульМенеджер, который проходился по папке с модулями и инициировал эти самые модули (отдельная подпапка). Вся подгрузка была завязана на соблюдении именования файлов. При подгрузке создавались не только объекты, но и загружались конфиги из отдельных файлов, создать сущности, добавлялись какие-то настройки в админку, регистрировались ендпоинты для ajax, и создавались/обновлялись таблицы в БД (что-то вроде миграций) при необходимости. Не то что бы это были тяжелые задачи но WP и не предполагает, что у тебя будут выделенные серваки и память довольно ценный ресурс.
Часть модулей выполнялись один раз и больше их не трогал, а другие инкапсулировали в себе определенный функционал.
К примеру был модуль сплит-теста, который в сессии хранил значение и выводил каждому пользователю его вариант отображения блока. На нужных страницах просто обращался к менеджеру и получал нужный модуль. Хотя про очистку как то не додумался, а было и некое подобие классов-моделей. там это точно надо будет реализовать.
Может будет полезен как пример для тебя. А тебе огромное спасибо за пояснение.
Теоретический вариант применения - веб-консоль управления пулом серверов при наличии более одного админа. Но тогда клонирование не годится.
То есть получается что в пулле в отличии от dic идёт блокировка объекта?
Все. Понял. Спасибо. Да, в пхп это сложно на примере обяснить.
Интересно. Но я ищу для Unity на C#...
шаблон не для синхронного программирования, вахтер с ключами, имхо
Возможно кому то в будущем пригодится.
В общем в классе ObjectPool (если ты все делаешь, как в уроке, тогда именно в этом классе) строка вида public function release(ObjectPoolableInterface &$obj) и public function addObject( ObjectPoolableInterface$obj) выдают одинаковую ошибку "Argument 1 passed to App\DesignPatterns\Creational\ObjectPool\ObjectPool::release() must be an instance of App\DesignPatterns\Creational\ObjectPool\Interfaces\ObjectPoolableInterface, object given, called in C:\xampp\htdocs\laravel\patterns.local\app\DesignPatterns\Creational\ObjectPool\ObjectPoolDemo.php on line 54".
Решением оказалось убрать ObjectPoolableInterface, т.е. рабочий вариант public function release(&$obj) и public function addObject($obj). Laravel Framework 5.8.38
Вспомнил видосик - "он нам нахуй не нужон, интерфейс ваш!" 😁😁😁 может надо было ошибку поискать раз в видео всё работает?
@@DmitryAfanasyev дык, в том то и дело, что искал, плохо ли хорошо, но искал в меру своих возможностей)...попытался убрать интерфейс и ошибка сгинула) но если в идеале должно с интерфейсом работать, ну тогда спустя время сделаю еще подход по поиску ошибки. А так то это не камень в Ваш "огород"))
@@DmitryAfanasyev Заработало! имплементировал классы User, CreditCard и Calculator от интерфейса, прописал в них public function __clone()
{
// TODO: Implement __clone() method.
}
и о счастье)) Автору огромное спасибо за труды и подсказку в ответе!)
Интерфейс в том самом месте для того и прописывать чтобы пришёл только правильный объект. Как фейсконтроль в клубе. Убрав его, по сути убираем и озранника у входа - может ничего и не случится, а может и клуб спалят.
+++