Одиночка. Singleton ► Шаблон проектирования ► Урок №9
HTML-код
- Опубликовано: 2 авг 2019
- Порождающий паттерн (шаблон) проектирования - Одиночка (Singleton).
Рассмотрим три варианта реализации шаблона singleton.
.
Преимущества:
+ Гарантирует наличие единственного экземпляра класса.
+ Предоставляет к нему глобальную точку доступа.
+ Реализует отложенную инициализацию объекта-одиночки.
.
Недостатки:
- Нарушает принцип единственной ответственности класса (см SOLID).
- Проблемы мультипоточности.
- Требует создания Mock-объектов во время тестировании.
- Сложно отследить зависимости классов.
#шаблоны_проектирования #design_patterns #singleton
*
★ Автор: Дмитрий Афанасьев.
★ Телеграм с новостями: t.me/i640kb
★ Канал: clck.ru/JVYct
*
► Выразить благодарность, поддержать донатом развитие канала.
★ www.tinkoff.ru/rm/afanasev.dm...
★ www.donationalerts.ru/r/dmitr...
*
► Еще интересные курсы:
★ Видеокурс по Laravel: clck.ru/JVYa2
★ Видеокурс по Git: clck.ru/JVYYm
★ Объяснение SOLID: clck.ru/JVYXq
★ Шаблоны проектирования: clck.ru/JVYX7
★ Структурные шаблоны проектирования: clck.ru/TVB9Y
★★★ Все курсы → clck.ru/JVYVd
*
► Обязательно к изучению любому разработчику
★ www.ozon.ru/category/knigi-16...
★ www.chitai-gorod.ru/search/re...
По заказу из донатов - следующий шаблон - Стратегия
Спасибо! Очень ждем!
А есть донаты с пожеланиями освещения unit тестов? Я бы внес свой вклад в донат для этой темы, если есть шанс что она войдет в курсе по ларе
Может пора реализовать донат-голосовалку полноценную?
Спасибо за труды)
Спасибо. Было полезно
Казалось бы, простой шаблон, но из видео узнал... увидел наглядный пример использования позднего статического связывания и оператор объединения с null. Даже не знал, что такой есть. И идея с трейтом интересная, можно просто копипастить из проекта в проект, не надо писать ручками. Хотя бы с такой точки зрения - полезная штука.
А ларавел синглтон странный, если объект его класса можно и через new создать.
Если синглтон может сохранять состояние, то это Реестр)
Спасибо, было вкусно
Продолжай!
Супер
Спасибо )
всё чётко, могёте 2:08
круть
Ух ты, добавлено 18 секунд назад)
Да, синглтон знают все)
О класс, я тоже когда начинал знакомиться с ларавелом, сделал трейт синглтона, не такой крутой конечно)
1:03 😂😂 Да, я соглашусь.
Херак Херак и в продакшен))
Очень полезные видео, примеры! Хотелось бы почупать, попробовать, посмотреть более детальнее. Есть ли какой то репозиторий или ссылка откуда можно скачать?
На текущий момент времени только такой способ получить исходники - ruclips.net/video/Hz7U5XiPkkg/видео.html
private в __wakeup больше не доступен.
Замечательные видео. Смотрю с удовольствием и черпаю знания.
Небольшая неточность
На 11:43 вы говорите "мы запрещаем клонирование".
Но это не так.
Метод __clone() дополняет обычное клонирование объекта, а не переписывает его.
Тут маленький тест чтобы проверить prnt.sc/zgcyrc
Дмитрий давно хотел у вас спросить а как вы располагаете открытые вкладки в Шторме справа в столбик? Искал как сделать не нашел))) Может конечно я плохо искал)))) Но все же хотел бы у Вас узнать)))
Я немножко покопался в синглтоне, вроде бы всё очень банально, но всё равно остаётся дыра из-за которой можно создать новый объект. Можно создать объект используя статический метод класса. Даже если закрыт конструктор, хитрый новый разработчик может прийти, создать любой статический метод в классе и вернуть в нём "new self()". И вот ничего с этим не могу решить. Насколько я понимаю создание объекта внутри класса игнорирует приватность метода конструктора. В принципе это можно обойти, если вместо трейта сделать абстрактный класс и наследовать его, но тут мы должны быть уверены, что тогда класс, наследующий этот абстрактный класс синглтона не имеет публичного конструктора. Короче в php неоднозначно это всё и защиту от дураков не сделаешь или может я дурак и не нашёл, как это сделать.
Может и не стоит зацикливаться на дураках, например классы синглтоны ларавелы тоже не защищены и в их случае экземпляр нужно получать только через DI или IoC контейнер, но ничего не мешает сделать new Illuminate\Http\Request
А вообще спасибо вам за порождение интереса к паттернам проектирования
Приватный метод не доступен извне, но доступен самому классу. Так что игнорировать ничего не не надо. Если пугает то, что могут дописать новые методы, класс можно сделать final. А если редактировать сам класс, так можно просто убрать приватность с конструтора, зачем писать ещё новые методы.
А свойство $singletons, созданное в AppProvider - это какое-то предопределенное название? Сначала просто назвал $singleton и долго не мог понять почему мне Ларавел ошибку выкидывает:
Illuminate\Contracts\Container\BindingResolutionException thrown with message "Target [App\DesignPatterns\Creational\Singleton\Interfaces\AnotherConnection] is not instantiable."
Спасибо за видео!
да. и об этом говорится в видео
Забыл в SimpleSingleton классе закрыть конструктор!
Смотри еще что заметил, можешь запутать новичков:
149 строка - запрашиваем создание объекта реализующего интерфейс AnotherConnetion
150 строка - используем метод которого нет в интерфейсе.
Понятно что это пример ради примера, но я когда пытался въехать в такие вещи, - офигевал когда были какие то расхождения)
Ну вот, видео досмотрел, я как то даже и не думал за магические методы, годное видео, спасибо за труд)
Я же сказал об этом - что для правильности метод надо объявить в интерфейсе...
Дмитрий, здравствуйте, смотрю ваш канал уже полгода :)
Можете сделать урок о том, как сделать на своем сайта на laravel внутреннюю валютную систему?
Если кратко - пользователи могут покупать условные монетки на сайте, с помощью которых они могут играть друг с другом в шахматы. Эти монетки можно выводить на webmoney, банковскую карту. Нет ни одного урока в интернете как реализовать такую систему безопасно и надежно.
Раскроете тему? :)
Это тянет на хороший курс )))))
Хороший - всмысле - не маленький.
@@DmitryAfanasyev , буду рад, если выпустите такой курс :) приобрету самый первый! :)
@@lilwayne5504 в принципе если с логикой у вас все хорошо, то вам потребуется всего 2 пакета.
1 - биллинг любой удобный вам (стоковый для Лары есть в документации или же Omnipay или Payum) сравнение последних можно найти на тостере.
2 - пакет для работы с внутренней валютой (таблица с id пользователя и кол-вом монет)(минимальный набор) так же (таблица транзакций)(но тут надо тестить нужна ли она) и сам класс реализующий механику работы (передачу монет между пользователями и защиту от передачи большего значения суммы монет чем есть. Так же гетер чтобы получить текущий баланс и думаю все) для вывода средств с сайта придется что-то колхозить, а так в общем то что вы хотите реализовать я вижу как-то так. Может быть Дмитрий как белое опытный программист увидит в этом описании то что я не продумл. Но думаю общая концепция должна выглядеть как-то так
Есть во вконтакте такие шахматы. Не знаю кто в это вообще играет, когда есть бесплатные аналоги) Я бы сказал, что это изначально мёртвая идея, но видимо этим кто-то пользуется.
Честно говоря в реалиях РНР даже не знаю, где этот шаблон пригодится. Это же не локальное ПО, где классы существуют пока работает ПО. Хотя если писать что-то прям совсем тяжелое, где перегружаться вся страница не будет, то да, но я до такого уровня еще не дорос.
В смысле не знаешь где пригодится? Используется и очень часто.
Будь он не востребован - в ларавел бы точно не включили возможность порождать их на автопилоте.
Я правильно понимаю, что объект уникален только в цикле работы приложения для одного конкретного пользователя? То есть сколько пользователей, столько и объектов таких?
@@user-cb2df9zy6d Объект один, сссылок на него много только может быть, так как переменная в ПХП ссылки на объекты копирует.
@@user-cb2df9zy6d что вы подразумеваете под пользователем? Объект уникален во время выполнения php скрипта. В те секунды или милисекунды, что сервер возвращает ответ клиенту ( чаще всего браузеру ).
По поводу сохранения состояния:
В классе работы с БД мы ведь вынуждены хранить «подклбчение» к БД, верно?
А методы того же Логгера сделать статическими и забыть о создании синглтона.
Что я не понял правильно?
Ух ты, добавлено 18 секунд назад)
Да, синглтон знают все)