Шаблоны Java. Приспособленец (Flyweight)

แชร์
ฝัง
  • เผยแพร่เมื่อ 16 ต.ค. 2024
  • Шаблон проектирования Flyweight (Приспособленец) предназначен для уменьшения количества объектов в приложении путем совместного их использования.
    Flyweight дополняет шаблон Factory Method таким образом, что при обращении клиента к Factory Method для создания нового объекта ищет уже созданный объект с такими же параметрами, что и у требуемого, и возвращает его клиенту. Если такого объекта нет, то фабрика создаст новый.
    вКонтакте: java4you
    Плейлист: • Шаблоны проектирования...
    Видео: • Шаблоны Java. Приспосо...

ความคิดเห็น • 17

  • @RussianCyclop
    @RussianCyclop 2 ปีที่แล้ว +1

    Комментарий 5 лет спустя...) Спасибо за видео. Небольшой нюанс, разве это абстрактная фабрика, мне кажется это просто фабрика она же factory method.

  • @artempryzhkov2818
    @artempryzhkov2818 8 ปีที่แล้ว

    Отличная серия, жду твоей реализации Interpreter

  • @alext711
    @alext711 8 ปีที่แล้ว

    Спасибо!)

  • @agnar878
    @agnar878 ปีที่แล้ว

    Тут 2 паттерна синглтон и фабрика. И никакая не абстрактная, а самая обычная. Основная суть легковеса(хз, откуда приспособленец вылез), экономить память за счет хранения обших для обьектов ресурсов. А тут просто обьекты не создаются, если уже созданы. Как-бы разные вещи. Убрать отсюда фабрику и будет типичный снглтон. Убрать синглтон и будет просто фабрика. Суть паттерна не раскрыта.
    А вот в примерах которые вы разбираете дальше, как раз есть корректный пример.

  • @UstinBelarus
    @UstinBelarus 7 ปีที่แล้ว

    ты в примере создаёшь 3 круга с радиусов = 5, объект создаётся только для первого круга, и в 2-х следующих операциях он переиспользуется - это понятно. А что если нам необходим круг с любым другим радиусом ? Круг с радиусом 6, создаст новый объект ?

    • @rustammurtazin3265
      @rustammurtazin3265 7 ปีที่แล้ว

      Да, или создать метод, чтобы задать радиус перед отрисовкой.

    • @lichlichi
      @lichlichi 6 ปีที่แล้ว +2

      Нет, создание такового невозможно в рамках этого кода и паттерна в принципе. По ключу "круг" map имеет 1 объект-экземпляр с радиусом 5. В List добавляются 3 ссылки на этот экземпляр. Если использовать get метод, то вернётся старый добрый круг с радиусом 5. Для изменения этого значения его необходимо вывести как внешнее значение, а не внутреннее. Либо оформить новый , отдельный от этого класс.
      Вариант с установкой радиуса как отдельного метода не подходит под этот паттерн, так как тут либо разделяй на внешнее(контроль радиуса будет через параметр в draw) и внутреннее состояние , либо не используй этот паттерн вовсе. Если же тебе всё же необходимо изменять с каждой надобностью объекта класса "круг" его внутреннее значение, то посмотри другие паттерны. Его применяемость на практике довольно таки мала, он очень радко где используется.

  • @61DANTE
    @61DANTE 8 ปีที่แล้ว

    я что-то не понимаю, или как в shapes(final Map) запихиваются фигуры?
    там же константа должна быть, при попытке изменить final объект дожна быть ошибка, а мы тут как раз вставляем фигуры

    • @BogdanShulga
      @BogdanShulga 7 ปีที่แล้ว +3

      В данном случае shapes это сслыка на объект типа MAP который хранится в пямяти. И final говорит, что мы не можем shapes`ам присвоить новую ссылку(тоесть заменить объект сделав new HashMap()). Но нам ни кто не мешает изменять состояние данного объекта. А в качестве состояния у него выступает "грубо говоря!" массив в который мы можем ложить обекты flyweight в любом количестве.

  • @Smolandgor
    @Smolandgor 8 ปีที่แล้ว

    Вообще что бы проверить лежит ли что то в мапе можно и containsKey() или containsValue() заюзать.

  • @lichlichi
    @lichlichi 6 ปีที่แล้ว

    А разве это не Фактори метод используется на диаграмме?)

    • @nickcoffeemaniac6476
      @nickcoffeemaniac6476 6 ปีที่แล้ว

      В реальных ситуациях почти всегда используются комбинации шаблонов, это норма, лишь бы код был эффективным, удобным и легкочитаемым. Пардон за некропостинг, если что...

  • @ttttt5191
    @ttttt5191 8 ปีที่แล้ว +5

    Вряд ли flyweight переводится так))

    • @off6797
      @off6797 5 ปีที่แล้ว +3

      Легковес.
      Приспособленец видимо придумали русаки.

    • @damirdamir8388
      @damirdamir8388 3 ปีที่แล้ว +1

      flyweight - вес мухи)))

  • @alexeystaroverov4804
    @alexeystaroverov4804 7 ปีที่แล้ว +1

    эээ, ты вообще в курсе, что в map не могут храниться 2 одинаковых ключа? ))) то есть не надо проверять, есть ли он там уже ))) а надо переопределить equals и hashmap ))) и он автоматически не будет туда попадать ) паттерны ты знаешь, но вот коллекции - это ппц )))
    Т.е просто создаешь фигуру и пытаешься ее запихать в map, она туда не полезет, если уже там есть. А чтобы не создавались много однотипных фигур, юзай синглтон

    • @lichlichi
      @lichlichi 6 ปีที่แล้ว +3

      Проверка на наличие сделана для того, что бы не перезаписать существующий(если он там окажется). Если он там уже есть, то значит нужно его просто получить(не резервируя на точно такой же объект память) для каких то вызовов. В данном случае экземпляр круга в List только 1, а объектов 3. Но пагубным является то, что при изменении какого либо из 3 "кругов", значение поменяют и остальные.
      Всё равно синглтоны необходимо будет хранить где то, здесь это удобнее + синглтон можно сериализовать а затем десериализовать и получить 2 синглтон(речь о стандартной его реализации) , так как синглтон своё создание контролирует сам, а здесь эту роль принимает Фабрика.
      Проблематика этого паттерна немного в другом. Он помогает использовать уже созданное, под разные задачи а не резервировать память заново.
      Например что бы написать слово в комментарий, я использую буквы(объекты в map) из алфавита(сам map, из примера).