Шаблоны Java. Фабричный метод (Factory Method)

Поделиться
HTML-код
  • Опубликовано: 4 янв 2025

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

  • @elenakhatmullina13
    @elenakhatmullina13 2 года назад +3

    Эти лекции - высший пилотаж и непередаваемое удовольствие. Огромное человеческое спасибо, талантливому лектору.

  • @Markerton
    @Markerton 9 лет назад +16

    Ваня , спасибо большое что учите нас ! )

    • @programm4you
      @programm4you  9 лет назад +2

      +FryBrix chanel на здоровье!))

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

      его же вроде Володя зовут

  • @GlassedUA
    @GlassedUA 9 лет назад +11

    Много искал адекватное обьяснение фабричного метода. Большое спасибо.

  • @АлексейДенега-в8б
    @АлексейДенега-в8б 8 лет назад +2

    Как по мне, так наиболее понятные уроки по шаблонам.Респект!!!

  • @mirkogrey9076
    @mirkogrey9076 6 лет назад +2

    Пожалуй одно из лучших объяснений этого шаблона!!!

  • @nickcoffeemaniac6476
    @nickcoffeemaniac6476 6 лет назад +1

    Огромное спасибо за урок! Наконец-то до меня дошло. Самый лучший и понятный пример.

  • @Armen_Sarkisian
    @Armen_Sarkisian 7 лет назад +1

    Большое спасибо за подробный видео урок данного шаблона! Только благодаря Вам стало более-менее понятно что к чему!)

  • @voothi
    @voothi 4 года назад +1

    Тоже заметил на 3:23 про "наследование" вмето "реализация".
    Здесь понятно, что класс ConcreteCreator
    реализует интерфейс Creator и т.д. там, где пунктирная стрелка
    .
    Отношения между классами:
    - при наследовании классов и реализации интерфейсов - IS-A (является), но есть уточнение, что в случае реализации интефрейсов - это скорее IS..., т.к. интерфейсы позволяют описать т.н. протокол, где говориться "Что", а не "Как".
    - при ассоциации, агрегации и композиции - HAS-A (является частью)
    Если я где-то не точен, ответьте мне - интересно.
    - - -
    наследование == extends, inheritance
    отношение == relationships
    реализует, расширяет == implements
    контракт, протокол == contract, protocol
    www.examclouds.com/ru/java/java-core-russian/class-relations
    stackoverflow.com/questions/35962451/what-kind-of-relationship-does-an-interface-have-with-it-implementing-class

  • @garmon271
    @garmon271 7 лет назад +1

    Хоспаде, как же доступно! Спасибо за труд!

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

    это видео дало мне понимание в чем выгода от использования данного паттерна

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

    2:26 "Класс! Просто класс!" -- сук, до слёз)))

  • @integernone3525
    @integernone3525 7 лет назад

    Супер-удачно пример подобран с часами, спасибо!

  • @HowItWorks
    @HowItWorks 5 лет назад +3

    Очень не плохое обьяснение. Но на мой взгляд главная изюминка в применении этого всего заключается как раз в работе с интерфейсами. А именно, мы можем просить фабрику (разные линии конвееров) создать нам товар без использования ифов и кейсов в коде. Другими словами мы уходим от гигантской вереницы if ... else в коде. В этом вся соль. Об этом как то не сказано ничего.

  • @HowItWorks
    @HowItWorks 7 лет назад

    Есть вопрос. Как в данном случае избавится от гирлянды из if в getMakerByName ? Допустим у нас сотни часов. Гирлянда в сотни if не очень красивая как по мне. Что можно сделать?

    • @maxim.toleutai
      @maxim.toleutai 5 лет назад

      В каждой фабрике создать статическое свойство с неким уникальным названием, описывающим сущность. Создать массив или список всех классов (можно так же автоматизировать), а потом через проход по всему массиву (итерация): сравнивать свойство класса, с уникальным названием, со строкой в методе - при совпадении создавать соответствующую фабрику.

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

      Создав это свойство, надо при загрузке класса перегрузить все фабрики в мапу и получать эту фабрику из готовой мапы, чтоб не бегать по всему массиву

  • @dmytro_bro
    @dmytro_bro 5 лет назад +3

    Непанятна. Все что делает "Завод производитель" это производит часы (в данном примере) разного типа. Смысл менять тип "завода производителя", если можно с теми же усилиями заменить тип часов, а не заменять тип завода. ?????????????

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

    Kak hazivaetsa kniga iz video?

  • @Marinakulichok
    @Marinakulichok 8 лет назад +1

    Очень хорошее объяснение! Спасибо

  • @Дмитрий-з7м9е
    @Дмитрий-з7м9е Год назад

    Браво!!!!

  • @ИТ-территория
    @ИТ-территория 8 лет назад +13

    зачем ради неизменности трёх строк кода столько обслуживающего кода? почему бы по передаваемому имени часов не получать именно часы, а не их производителя?
    А какая разница? Любой большой проект - есть набор маленьких, взаимосвязанных между собой. По-моему скромному мнению, получение конкретного продукта по его уникальному имени - это более прозрачный и понятный программисту любого уровня способ реализации шаблона "фабричный метод".

    • @danyalOFF
      @danyalOFF 8 лет назад +3

      это в маленьком примере три строки кода. а теперь представь большой проект, где будет на несколько тысяч строк

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

      Так автор топика выше и говорит: ради трёх неизменных строчек кода-клиента гляньте сколько сверху нахуевертили! А теперь представьте огромный проект, там же геометрическая прогрессия будет лишней работы!
      Что по сути сделано: у двух схожих по поведению классов часов (общий предок интерфейс watch) вынесены конструкторы в отдельный класс - Watchmaker, конструкторы которого опять же вынесены в отдельный метод и реализуются по String наименованию первоначальных классов часов.
      Т.е. ещё раз: была абстракция интерфейс - watch на ней были реализованы реальные часы (digital и rome), но было мало просто создать один класс порождающий объекты от наименования часов, нужно было разделить часы на две группы, сверху налепить ещё два класса с выведенными в них конструкторами часов, после чего конструкторы уже этих классов вынести в ещё один отдельный метод, который, внимание... ПРИНИМАЕТ СТРОКОВУЮ ПЕРЕМЕННУЮ, ЧТОБЫ СОЗДАТЬ ТЕ САМЫЕ ЛИБО DIGITAL, ЛИБО ROME WATCH!!!
      Как говорили древние китайцы нахуа?
      Лично мне это напоминает шизофазию, только в виде кода.

    • @alexeystaroverov4804
      @alexeystaroverov4804 6 лет назад +1

      Эту СТРОКОВУЮ ПЕРЕМЕННУЮ можно поместить в конфигурационный файл, который можно подменять на лету, не останавливая программу. Если же создавать классы самому, придеться останавливать программу ( а это может быть веб сервис какой-нибудь на яндексе) в коде менять, проходить все процедуры тестирования / интеграции / деплоя

    • @alexeystaroverov4804
      @alexeystaroverov4804 6 лет назад

      "почему бы по передаваемому имени часов не получать именно часы, а не их производителя" - да, в реальности все пропускают эту ступень с производитетелем, и сразу создают продукты в зависимости от условий

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

    У Гранда написано, что курсивом выделяются абстракные классы. А интерфейсы -- просто стереотипом "interface".

  • @kandidat8134
    @kandidat8134 6 месяцев назад

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

  • @scZooK
    @scZooK 9 лет назад +1

    Спасибо за урок!

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

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

  • @ПавелКокорин-и4м
    @ПавелКокорин-и4м 9 лет назад +8

    я так и не понял смысл этого паттерна.
    ruclips.net/video/HZ4ciLNWX4E/видео.htmlm27s
    в данном случае мы можем просто менять
    Watch watch = new DigitalWatch();
    на
    Watch watch = new RomeWatch();
    и в таком случае код ниже тоже изменять не потребуется

    • @ПавелКокорин-и4м
      @ПавелКокорин-и4м 9 лет назад

      какая разница подменять экземпляр maker либо экземпляр watch. результат одинаков

    • @ПавелКокорин-и4м
      @ПавелКокорин-и4м 9 лет назад +3

      я так думаю имеет смысл создавать дополнительный класс maker, если имеются какие либо сложные составные объекты и существует сложность создания таких объектов ...

    • @bondarden
      @bondarden 8 лет назад +11

      Вы правы. Именно для этого фабрика и нужна. Автор упустил этот важный момент, к сожалению. В данном примере класс-создатель и класс-продукт просто параллельные классы. И класс-создатель только и делает, что создает экземпляр класса-продукта. Пример был бы более полноценный, если бы класс-создатель помимо создания экземпляра класса-продукта делал бы еще какую либо работу, что, в принципе, и предполагается на практике.

    • @iha3775
      @iha3775 7 лет назад +1

      Спасибо большое за ваше пояснение, теперь все по полочкам! Да кстати, почти во всех источниках от официальных изданий до личных блогов, везде один и тот же формальный пример реализации и не слова про оптимизацию дополнительных манипуляций при инстанцировании сложный классов. Еще раз благодарю!

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

      @@bondarden что значит "класс-продукта делал бы ещё какую либо работу"? Не совсем понял вас. А как же чистый код? Не рекомендуется нагружать методы чем то ещё что не предполагалось в названии метода. Например вы создаете метод createDigitalWatch в котором помимо интанциирования нужного экземпляра часов будете создавать каких то юзеров для этих часов или писать в базу что то или что то другое. Тем самым введёте в заблуждение разработчиков.

  • @Gorbatov86
    @Gorbatov86 9 лет назад

    Просто и Понятно, спасибо большое!!!!

  • @dvdshel
    @dvdshel 8 лет назад

    Отличный урок!

  • @progtest109
    @progtest109 2 года назад

    Фабричный метод -это статический метод который возвращает экземпляр классса

  • @OlexanderL
    @OlexanderL 8 лет назад

    И от меня спасибо.

  • @maksimus.ssirotkin1124
    @maksimus.ssirotkin1124 5 лет назад

    Отличное видео

  • @eugeneneo834
    @eugeneneo834 8 лет назад

    Спасибо!

  • @grinflur
    @grinflur 7 лет назад +3

    concrete это бетон)

  • @functionon6804
    @functionon6804 8 лет назад

    отличный урок

  • @romanberla
    @romanberla 7 лет назад

    Затянуто, непонятно, без подготовки

  • @АннаМусатенко
    @АннаМусатенко 6 лет назад

    Concrete - переводится как "бетон", а не конкретный

  • @nekitos3269
    @nekitos3269 9 лет назад +2

    то что надо

    • @programm4you
      @programm4you  9 лет назад +2

      +Nekit os спасибо, следующий будет Абстрактная фабрика

  • @alexeystaroverov4804
    @alexeystaroverov4804 6 лет назад +4

    WatchMaker -> Factory, getMakerByName -> factoryMethod, конкретных мейкеров - в топку, производить сразу вместо конкретных мейкеров. Немного не по книжке, но в жизни юзают так все.
    PS: ржу как аффтар использует англ язык ))) "а производитель переведем как мейкер )))"

  • @ВалерийЦелищев-ш6з

    ?:
    Элементная база (железо) разных часов - разная => конвейеры должны быть разными и код, управляющий конвейерами (клиентский код) - тоже разный. И что крестьянину делать%( ?

  • @andrewvalevskiy3879
    @andrewvalevskiy3879 9 лет назад +5

    Спасибо за урок! Неправильно говорить, что класс наследует интерфейс, он реализует его. После слов класс наследует интерфейс любое собеседование провалено

    • @Smolandgor
      @Smolandgor 8 лет назад

      Наследует вообщем то тоже не правильно говорить, более правильно говорить расширяет.

    • @R1d3rrr
      @R1d3rrr 7 лет назад +2

      Наследование и реализация - общепринятые понятия. Можешь сказать расширяет. Но наследовать интерфейс нельзя. Наследование и имплементация (реализация) - разные понятия.

    • @nikolaiii3
      @nikolaiii3 7 лет назад +4

      Можно наследовать интерфейс, другим интерфейсом.

  • @paradise_cracked
    @paradise_cracked 7 лет назад

    thx

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

    нервируют кривые пальцы и опечатки

  • @stanislavzemlyakov5442
    @stanislavzemlyakov5442 7 лет назад

    Спасибо за урок, но есть замечание. Когда класс реализует интерфейс - это всё же не "наследование".

  • @oculus1371
    @oculus1371 6 лет назад

    Спасибо!!