Одиночка. 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...

Комментарии • 43

  • @DmitryAfanasyev
    @DmitryAfanasyev  5 лет назад +7

    По заказу из донатов - следующий шаблон - Стратегия

    • @alex331911
      @alex331911 5 лет назад

      Спасибо! Очень ждем!

    • @dmitryocheretko703
      @dmitryocheretko703 4 года назад

      А есть донаты с пожеланиями освещения unit тестов? Я бы внес свой вклад в донат для этой темы, если есть шанс что она войдет в курсе по ларе

    • @dmitryocheretko703
      @dmitryocheretko703 4 года назад

      Может пора реализовать донат-голосовалку полноценную?

  • @dmitryleiko2869
    @dmitryleiko2869 5 лет назад +1

    Спасибо за труды)

  • @codemaniacchannel6422
    @codemaniacchannel6422 3 года назад +1

    Спасибо. Было полезно

  • @draackul
    @draackul 3 года назад +1

    Казалось бы, простой шаблон, но из видео узнал... увидел наглядный пример использования позднего статического связывания и оператор объединения с null. Даже не знал, что такой есть. И идея с трейтом интересная, можно просто копипастить из проекта в проект, не надо писать ручками. Хотя бы с такой точки зрения - полезная штука.
    А ларавел синглтон странный, если объект его класса можно и через new создать.
    Если синглтон может сохранять состояние, то это Реестр)

  • @user-uh1rm8py7b
    @user-uh1rm8py7b 4 года назад

    Спасибо, было вкусно

  • @user-vk4vr8iy7b
    @user-vk4vr8iy7b 5 лет назад

    Продолжай!

  • @hamidimomov232
    @hamidimomov232 3 года назад

    Супер

  • @alexanderk4481
    @alexanderk4481 Год назад

    Спасибо )

  • @user-sv7cf6ll2i
    @user-sv7cf6ll2i Год назад

    всё чётко, могёте 2:08

  • @user-gw2rx7sq7j
    @user-gw2rx7sq7j Год назад

    круть

  • @eaglesm1993
    @eaglesm1993 5 лет назад +1

    Ух ты, добавлено 18 секунд назад)
    Да, синглтон знают все)

  • @eaglesm1993
    @eaglesm1993 5 лет назад

    О класс, я тоже когда начинал знакомиться с ларавелом, сделал трейт синглтона, не такой крутой конечно)

  • @LSMacox
    @LSMacox 4 года назад

    1:03 😂😂 Да, я соглашусь.

  • @alexcc333
    @alexcc333 4 года назад

    Херак Херак и в продакшен))

  • @devvv747
    @devvv747 5 лет назад +1

    Очень полезные видео, примеры! Хотелось бы почупать, попробовать, посмотреть более детальнее. Есть ли какой то репозиторий или ссылка откуда можно скачать?

    • @DmitryAfanasyev
      @DmitryAfanasyev  5 лет назад

      На текущий момент времени только такой способ получить исходники - ruclips.net/video/Hz7U5XiPkkg/видео.html

  • @soversus5374
    @soversus5374 2 месяца назад

    private в __wakeup больше не доступен.

  • @user-ni1tr8qg5m
    @user-ni1tr8qg5m 3 года назад

    Замечательные видео. Смотрю с удовольствием и черпаю знания.
    Небольшая неточность
    На 11:43 вы говорите "мы запрещаем клонирование".
    Но это не так.
    Метод __clone() дополняет обычное клонирование объекта, а не переписывает его.
    Тут маленький тест чтобы проверить prnt.sc/zgcyrc

  • @user-sb5lb3ql5f
    @user-sb5lb3ql5f 4 года назад

    Дмитрий давно хотел у вас спросить а как вы располагаете открытые вкладки в Шторме справа в столбик? Искал как сделать не нашел))) Может конечно я плохо искал)))) Но все же хотел бы у Вас узнать)))

  • @TimmertPlay
    @TimmertPlay 3 года назад

    Я немножко покопался в синглтоне, вроде бы всё очень банально, но всё равно остаётся дыра из-за которой можно создать новый объект. Можно создать объект используя статический метод класса. Даже если закрыт конструктор, хитрый новый разработчик может прийти, создать любой статический метод в классе и вернуть в нём "new self()". И вот ничего с этим не могу решить. Насколько я понимаю создание объекта внутри класса игнорирует приватность метода конструктора. В принципе это можно обойти, если вместо трейта сделать абстрактный класс и наследовать его, но тут мы должны быть уверены, что тогда класс, наследующий этот абстрактный класс синглтона не имеет публичного конструктора. Короче в php неоднозначно это всё и защиту от дураков не сделаешь или может я дурак и не нашёл, как это сделать.
    Может и не стоит зацикливаться на дураках, например классы синглтоны ларавелы тоже не защищены и в их случае экземпляр нужно получать только через DI или IoC контейнер, но ничего не мешает сделать new Illuminate\Http\Request
    А вообще спасибо вам за порождение интереса к паттернам проектирования

    • @draackul
      @draackul 3 года назад

      Приватный метод не доступен извне, но доступен самому классу. Так что игнорировать ничего не не надо. Если пугает то, что могут дописать новые методы, класс можно сделать final. А если редактировать сам класс, так можно просто убрать приватность с конструтора, зачем писать ещё новые методы.

  • @noname-nonaymich
    @noname-nonaymich 4 года назад

    А свойство $singletons, созданное в AppProvider - это какое-то предопределенное название? Сначала просто назвал $singleton и долго не мог понять почему мне Ларавел ошибку выкидывает:
    Illuminate\Contracts\Container\BindingResolutionException thrown with message "Target [App\DesignPatterns\Creational\Singleton\Interfaces\AnotherConnection] is not instantiable."
    Спасибо за видео!

    • @mugen31337
      @mugen31337 4 года назад

      да. и об этом говорится в видео

  • @alex-and-er
    @alex-and-er Месяц назад

    Забыл в SimpleSingleton классе закрыть конструктор!

  • @eaglesm1993
    @eaglesm1993 5 лет назад

    Смотри еще что заметил, можешь запутать новичков:
    149 строка - запрашиваем создание объекта реализующего интерфейс AnotherConnetion
    150 строка - используем метод которого нет в интерфейсе.
    Понятно что это пример ради примера, но я когда пытался въехать в такие вещи, - офигевал когда были какие то расхождения)
    Ну вот, видео досмотрел, я как то даже и не думал за магические методы, годное видео, спасибо за труд)

    • @DmitryAfanasyev
      @DmitryAfanasyev  5 лет назад +1

      Я же сказал об этом - что для правильности метод надо объявить в интерфейсе...

  • @lilwayne5504
    @lilwayne5504 5 лет назад

    Дмитрий, здравствуйте, смотрю ваш канал уже полгода :)
    Можете сделать урок о том, как сделать на своем сайта на laravel внутреннюю валютную систему?
    Если кратко - пользователи могут покупать условные монетки на сайте, с помощью которых они могут играть друг с другом в шахматы. Эти монетки можно выводить на webmoney, банковскую карту. Нет ни одного урока в интернете как реализовать такую систему безопасно и надежно.
    Раскроете тему? :)

    • @DmitryAfanasyev
      @DmitryAfanasyev  5 лет назад

      Это тянет на хороший курс )))))

    • @DmitryAfanasyev
      @DmitryAfanasyev  5 лет назад

      Хороший - всмысле - не маленький.

    • @lilwayne5504
      @lilwayne5504 5 лет назад

      @@DmitryAfanasyev , буду рад, если выпустите такой курс :) приобрету самый первый! :)

    • @dimanstyle
      @dimanstyle 5 лет назад

      @@lilwayne5504 в принципе если с логикой у вас все хорошо, то вам потребуется всего 2 пакета.
      1 - биллинг любой удобный вам (стоковый для Лары есть в документации или же Omnipay или Payum) сравнение последних можно найти на тостере.
      2 - пакет для работы с внутренней валютой (таблица с id пользователя и кол-вом монет)(минимальный набор) так же (таблица транзакций)(но тут надо тестить нужна ли она) и сам класс реализующий механику работы (передачу монет между пользователями и защиту от передачи большего значения суммы монет чем есть. Так же гетер чтобы получить текущий баланс и думаю все) для вывода средств с сайта придется что-то колхозить, а так в общем то что вы хотите реализовать я вижу как-то так. Может быть Дмитрий как белое опытный программист увидит в этом описании то что я не продумл. Но думаю общая концепция должна выглядеть как-то так

    • @draackul
      @draackul 3 года назад

      Есть во вконтакте такие шахматы. Не знаю кто в это вообще играет, когда есть бесплатные аналоги) Я бы сказал, что это изначально мёртвая идея, но видимо этим кто-то пользуется.

  • @EdwardNorthwind
    @EdwardNorthwind 5 лет назад +1

    Честно говоря в реалиях РНР даже не знаю, где этот шаблон пригодится. Это же не локальное ПО, где классы существуют пока работает ПО. Хотя если писать что-то прям совсем тяжелое, где перегружаться вся страница не будет, то да, но я до такого уровня еще не дорос.

    • @medvedvshapke
      @medvedvshapke 5 лет назад +2

      В смысле не знаешь где пригодится? Используется и очень часто.

    • @DmitryAfanasyev
      @DmitryAfanasyev  5 лет назад

      Будь он не востребован - в ларавел бы точно не включили возможность порождать их на автопилоте.

    • @user-cb2df9zy6d
      @user-cb2df9zy6d 4 года назад

      Я правильно понимаю, что объект уникален только в цикле работы приложения для одного конкретного пользователя? То есть сколько пользователей, столько и объектов таких?

    • @vitall789
      @vitall789 3 года назад

      @@user-cb2df9zy6d Объект один, сссылок на него много только может быть, так как переменная в ПХП ссылки на объекты копирует.

    • @TimmertPlay
      @TimmertPlay 3 года назад +1

      @@user-cb2df9zy6d что вы подразумеваете под пользователем? Объект уникален во время выполнения php скрипта. В те секунды или милисекунды, что сервер возвращает ответ клиенту ( чаще всего браузеру ).

  • @modestusmunh93
    @modestusmunh93 Год назад

    По поводу сохранения состояния:
    В классе работы с БД мы ведь вынуждены хранить «подклбчение» к БД, верно?
    А методы того же Логгера сделать статическими и забыть о создании синглтона.
    Что я не понял правильно?

  • @eaglesm1993
    @eaglesm1993 5 лет назад

    Ух ты, добавлено 18 секунд назад)
    Да, синглтон знают все)