Factory Method pattern
HTML-код
- Опубликовано: 23 дек 2024
- In this video I'll show you why you need a factory method pattern. And explained how the factory method pattern affects the architecture of the application.
PS Example for factory method done at an accelerated pace, and if somewhere mistakes in the comments littering) If you find an error will be grateful for the pool request as amended.
EXAMPLE: github.com/nic...
Interfaces in practice: • Интерфейсы на практике
Polymorphism in practice: • Полиморфизм на практике
Channel Telegram: t.me/extremeco...
● VK: bit.ly/vk_extre...
● Telegram Chat: bit.ly/telegram...
● Twitter: bit.ly/twitter_...
Сори за очепятки и оговорки. Монтажил в 4 утра :D
как обычно в 4АМ
А я когда нибудь не монтажил в 4 утра? :D
класный ролик))
Зачет
ruclips.net/video/wad2t8WVHiA/видео.html про ошиПки
Увы, но это дизлайк. Подача с мемчиками и смехуечками - это прекрасно и действительно смотрится свежо, и не так "академически", как у многих авторов, но в данном видео есть одна большая проблема - содержание и проблемы с матчастью.
А теперь разъеб по фактам.
Автор начал рассказывать проблему и по-началу все было правильно до тех пор, пока он не перешел к решению. Представленное решение с выносом "порятнок" в отдельные классы и делегированию им логки порождения объектов - это не "Фабричный Метод", а "Абстрактная Фабрика". Шаблоны действителльно похожи и их часто путают или смешивают между собой, но в них есть кардинальные отличия и я объясню их.
Автор в конце видео верно заметил, что все шаблоны проектирования всегда решают какую то задачу или проблему, и именно в задачах кроется разница. Фабричный метод - это порождающий шаблон проектирования, смысл которого вынести логику создания объектов из абстракции в конкретные реализации этой абстракции. Что есть реализация, а что - абстракция? Абстракция - это некая логика работы программы. Эта логика не зависит от конкретных объектов и оперирует любыми из них одинаково. Для кода, содержащего абстрактную логику, в сущности, нет никакой разницы, с какими объектами он должен работать. Реализация - это, напротив, непосредственно детали, от которых зависит результат выполнения абстрактной логики.
Развивая пример автора в нужную сторону можно предположить, что для нашего супер-экшен-хорора существует множество локаций, одна из которых - это Парк. Объект Game отвечает лишь за то, чтобы собрать какую-то локацию и запустить в ней уровень, поэтому он откуда-то берет некий объект GameLocation и вызывает у него метод createLevel(). Метод createLevel() одинаковый для всех видов локаций - он создает объект персонажа, декорации, монстров, пасхалки, предметы для интерактива и много всего еще. Как читатель успел заметить, в описании работы метода createLevel() я оперирую абстрактными понятиями: "моб", "декорация", "предметы интерактива" и т.п. Для отработки этого кода не так уж важно, какие именно мобы создаются и как они выглядят. Главное - создать КАКИХ-ТО мобов с помощью метода createEnemy(). Также следует понимать, что локаций много и мобы в них разные. В локации Детской площадки мы создаем яжматерей и бабок у скамейки, в парке - гопников и алкашей, в собственной хате - пьяного батю и поехавшего деда. Именно от этой конкретики и зависит уровень, так что, избегая развесистого if с выбором нужного моба, делегируем реализацию этой конкретики наследникам объекта GameLocation - ParkLocation, ApartmentLocation, PlaygroundLoaction и реализуем в них абстрактный метод createEnemy(). Любой из этих методов может попасть к объекту Game и любой из них по-своему создает объекты, которые нужны в ходе работы метода gameLocation.createlevel(). Эти самые методы, создающие объекты, такие как createEnemy() и называются Фабричными методами.
Теперь о фабрике. Абстрактная фабрика - это порождающий шаблон проектирования, который позволяет инкапсулировать создание семейств объектов. В видео автор предложил инкапсулировать логику создания объектов в отдельную иерархию класса, но до конца пример не довел и не объяснил главное предназначение примененного приема. Дабы не уходить в сторону от показанного в видео, буду исходить из примера про уровни сложности локации Парк с минимальными корректировками. Представим, что нам нужно реализовать генерацию мобов по уровням сложности. У нас могут быть простые мобы, средние и сложные. Скажем, на легком уровне у нас будут создаваться (по возрастающей) Shkolnik, Alkash, Exhibitionist, на среднем - Alkash, Exhibitionist, Gopnik, на харде - Exhibitionist, Gopnik, BuhoyMent. Выносим методы createRegularEnemy, createMediumEnemy, createBossEnemy в один интерфейс IParkEnemyFactory и пишем три реализации - EasyPark, MiddlePark, HardPark, в которых создаются семейства объектов для каждого уровня.
Класс (интерфейс) IParkFactory - абстрактная фабрика, которая своими методами порождает объекты IEnemy, а ее реализации отвечают за создание семейств согласованных по смыслу объектов. Абстрактную фабрику может использовать класс GameLocation или Game и порождать монстров согласованно.
Резюмируя: Фабричный метод порождает объекты и его использование основано на наследовании, абстрактная фабрика порождает семейства объектов и ее использовании основано на композиции или агрегации.
P.S Всем дочитавшим печенек и много защекоинов.
Пойду, что-ли, свой канал по паттернам заведу.
Огромное спасибо! Очень подробно и доступно, я даже законспектировал.
спасибо, сохранил 8 минут моего времени
Спасибо за развёрнутый ответ!
по моему это просто доеб ради доеба
Расхуярил смехуярика
Когда-то смотрел этот канал и для меня всё это было сложно...Теперь смотрю, вижу уже знакомые детали, иногда узнаю что-то новое и смеюсь от шуток (которые опять же, мне были непонятны) Да, немного, но личная победа, которой хочется поделиться
🙂
Братан, хорош, давай давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот по чаще
Ничего не понимаю, но смотрю каждое видео
Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?
Луркоформат самое оно.
Отличная идея для игры
Это. Просто. Ахуенно. Прям та подача, которой не хватало техническому ютубу.
true from iBydlo
Писал в университете лабу с этим паттерном (т.е. имел понятие, как он должен выглядеть), но до сих пор не понимал, зачем он нужен. Когда пришла необходимость понять, прочел статью refactoring.guru. Не добившись результата, посмотрел другой видос на ютубе (Там тоже не получил полного понимания). Когда посмотрел твое видео, уже что-то начало более менее проясняться. Зашел по ссылке в описание в примеры с уверенностью после объяснения на видео, что там я точно получу ответ, и после этого я наконец-то полностью понял смысл данного паттерна. Спасибо)
Давай еще, буду смотреть все. И поржал и понял.
Ты описал не фабричный метод, а абстрактную фабрику. Я бы описывал этот паттерн в сравнении с композицией и агрегацией, т.е. позволяющий контролировать время жизни объектов как в случае с композицией, но позволяя использовать полиморфизм как в случае с агрегацией.
Чел прав
Че
@@ARTOMYS я тоже них*я не понял. вот любят многие выежнуться словечками))
@@policedog757 просто в видео описан другой паттерн пёс.паттерн - абстрактная фабрика, вместо - фабричный метод. и там и там фабрика (оба порождающие паттерны) но они разные.
Невероятно доходчивый метод объяснения, как и у всех остальных твоих видео. Большущий лайк)
Очень доступно и понятно. Автор, ты молодец!
В целом довольно не плохо интерпретировал, но вот за "var" в Cool Example я б спросил)))
На 6 минуте - еще в скобочки можно параметр засунуть и в зависимости от него будет создаваться тот или иной объект. В этом основная разница между подобным методом и конструктором.
Да, можно использовать какие-то дополнительные данные, которые могут поступить из конструктора. Но это всё не обязательные условия. Влиять на порождение объектов может всё что угодно по вашему желанию. Как я уже говорил в видео, это всё разные формы одного и того же паттерна.
Супер!
Без кода, непонятное дерьмо становится еще более запутанным.
Так есть же код.
Спасибо. Вроде полезно.
Годнота! Клепайте ещё! :)
Лайк за интерфейс IBidlo
огонь
спасибо
Расскажите про MVC паттерн, пожалуйста
сначала про ещё некоторые патерны должен рассказать, как минимум наблюдателя
нахера? наблюдатель тоже саме что и делегаты, достаточно понимать их
скорей реализация этого паттерна
Классный канал. Жаль интервалы между видео иногда большие.
Однозначно лайк. Буду сильно благодарен если продолжите раскрывать тему паттернов.
это шедевр )
Про рефлексию видосик?
как можно ставить дизлайк такому шедевру?
все просто и понятно! жду еще!)
ВидеВо 10 из 10)))) посмотрел и подписался!
Хороший канал!!! Очень жду где будем учить unity и писать игру!!!
на самом деле я плохо понял
надо больше разжевать момент как плохой код зарефакторить в хороший используя паттерн
больше блок схем
прекрасно, спасибо
Самые нелепый паттерн в теории паттернов. Его всегда подают так как будто это что-то такое революционно сокращающее объем программного кода. На самом деле применяешь его или не применяешь - программный код совершенно одинаковый, и по объему и по сложности.
1:00 слышно как он подумал что назвать следующим и решил не тратить еще 15 минут перезаписуя этот момент
лучший
2021
А что мешает сделать один класс BidloFactory и передавать ему int параметр уровня сложности? Зачем нужен интерфейс?
Костыльно: пойдёт разветаления в "switch" или "if"
ржу))) Полезно и просто, спасибо
Лайк, конечно же, но когда будут потоки и параллельные вычисления для особо маленьких и тупых?
+
@@guitarplayerJS ruclips.net/video/D9qcKV4j75U/видео.html&ab_channel=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%8D%D1%82%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE
Чем больше смотрю, тем больше убеждаюсь... Толковых людей, что умеют внятно обьяснить материал --- это не единицы! это еще меньше... в основном какие - то самоутверждающиеся выскочки, ищущий рейтинг или свое эго тешит... не понятно зачем такие пустые видео давать?! Ну если тебе от этого легче ... то поздравляю !!!!)))))
😂😂😂
Ты лучший!
Бомба!😍
Лайк, если ставил на паузу, чтобы прочитать всех обитателей парка
Может я чего-то не понял, но не кажется ли более логичным сделать передачу параметров в iBidlo при выборе сложности, после чего он будет генерировать уровень. Мне кажется тут немного не уместным данный паттерн. Кто будет для разных уровней сложности генерировать три класса ?
а ты представь если на этих уровнях будет скажем логика отличатся, например будет метод createEnemy() и в разных классах ты просто по разному его реализуешь, в одном кинешь слабого противника return new EasyEnemy, в другом среднего и тд. и это самый легкий пример логики, она может быть огромная, типа разной реакции на цепочку событий, как в хоррорах
@@fediciv обычная колода карт и частота генерации
Автор: говорит "вобщем и целом". Щербаков: бляяяяяяяяяяяя
Это когда чоткий пацан решил инициализироватт интерфейс, но его название не пропустила IDE
круто, спасибо. братишка помоги, расскажи как структурировать простой код? у меня один класс, в котором все захламлено, спасает то что додумался раскидать по частям в методы.
@@Nandarion Спасибо. А если у меня есть функции, которые часто используются в разных частях программы, есть смысл закинуть их в один модуль и импортировать из него эти функции во всех частях, где они нужны ? Или надо делать как-то ещё ?
@@Nandarion понял, спасибо
@@SergeyKomarov-k1k Говорят, что классы-утилиты - это плохо, но я точно не знаю
оспади, что-ж так сложно - фабрика лепит экземпляры в зависимости от неких условий. Это не обязательно другое поведение, и не обязательно алкашей. Ты мудрено объясняешь довольно простые вещи, ударяясь в болтовню искажаешь смысл. Зачем?
А видео по атрибутам будет?
Про абстрактную фабрику давай!!)
А планируются продолжения паттернов?
Поясните плиз упоминание инкапсуляции здесь. Где она?
Принцип инкапсуляции тут строится на пространствах имён.
Пространство имён с фабрикой, знает о быдлоиерархии, но не знает ничего о других частях программы. Ни о игре, ни о парке, ни о игровых объектах фабрики вообще не в курсе. Другие части программы имеют дело только с фабриками и знают о них, но ничего не знают о быдлоиерархии.
А это не абстракция фабрика?
Почти, как по мне то что он описал здесь (ruclips.net/video/ZAh3NQ9WiSg/видео.htmlm53s) и есть фабричный метод (только как минимум нужен параметр в методе согласно которому будут создаваться разные типы объектов), а то что он презентовал все время - это слегка недоделанная абстрактная фабрика.
Фабричный метод и абстрактная фабрика очень похожи. Разница заключается в том, что абстрактная фабрика порождает связанные объекты из разный иерархий.
P.S. Многие считают, что
public IEnemy Create(enum data){
switch(data){
case enum.first:
return Bidlo();
case enum.second:
return Alkash();
....
}
}
является абстрактной фабрикой, но это не так. На самом деле это пример обычного фабричного метода.
Я правильно понимаю, Абстрактная фабрика это когда есть два или больше метода, которые возвращают реализации разных интерфейсов? вместо одного, как в фабричном методе?Если очень грубо
Да, правильно. Но эти два или больше объекта должны быть как-то связаны.
Да, я это и имел ввиду. Просто в видео несколько фабричных методов, что автора исходного поста и спутало.
Я вроде бы понял, как это работает, но не понимаю, зачем... Зачем создавать прослойку из фабрик, если у нас есть метод, который в зависимости от принимаемого аргумента может возвращать не фабрику, а сразу нужный объект? Посмотрел уже несколько видео, но всюду этот вопрос не даёт покоя...
Господи, как я ору, лучший
в пятницу например больше алкашей, а в четверг больше гопников, чтобы настрелят на алкашку
Только фабричный метод это не класс, а метод со свитчем внутри в базовом классе, который по параметру и возвращает новый производный класс.
Кстати в udk та-же система создания обьектов.
Ninject ведь для этой цели тоже используется? Продолжайте снимать видосы про паттерны, хоть так их попробую выучить)
Ninject это DI/IoC, совершенно разные вещи на самом деле
Можно чуть подробнее?
Мы можем создавать быдланов в фабрике, как в примере, а можем прописать условные привязки для нинжекта и создавать их с его помощью, не? Или это неосновная фича нинжекта?
ну как я понимаю, нинджект это внедрение зависимостей, нам в коляжке сказали его использовать, когда мы делали проект на mvc, нужен для того, чтобы не было жёсткой привязки конкретных сервисов к конкретным контроллерам, например. Чтобы если у тебя проект сильно разросся, можно было легко заменить сервисы на новые, потому что нужно это сделать только в одном месте. Я думаю, что проблемы всё таки высосана из пальца)) Но если сайт, такой как вк, например, то это реально будет удобней намного
парни, что за трек
нихуя не понял, но очень интересно
Слегка напомнил концепцию полиморфизма.
Зачем создавать отдельный класс Фабрики, если можно всё это сделать в конструкторе Park???
тю.. всю жизнь так пишу, а что такое паттерны не пойму и по сей момент -_-
в прочем, я и в ООП не нашел ничего нового, странного или неестественного..
Кто понял что к чему? 8*ой раз раз читаю код проекта (из гитхаба), ну ни как не получается вшить в голову, суть того как применяется. Да фабрики.. инкапсуляция, и синтаксис, Технически все понятно, НООО смысловая нагрузка для пере - использования подхода в своих проекта Ни как пока не пойму, как ....
единственное нормальное описание!
Я вот вообще не кодер, не программист, просто мимо проходящий инженер. У меня вопрос к знающим: программистов вообще учат думать головой при обучении? При решении любой задачи любой человек создаёт систему алгоритмов. Эти алгоритмы так или иначе связаны между собой. То, каким образом человек решает эту систему и показывает его профессионализм. Другими словами, профессионал максимально упростит себе работу и этим максимально оптимизирует решение задачи ещё на этапе проектирования используя фичи, про которые рассказывает автор в цикле про ООП. Эти фичи ведь не только в программировании работают, но и в других сферах, где необходимо решение многоступенчатых задач со множеством неизвестных изначально либо изменяющихся во времени переменных. Получается очень унылая картина. Программистов мало, вокруг одни кодеры. Программист это инженер, а какой инструмент (читать "язык программирования") он использует, не имеет значения. Как электрик, который не будет винт под шлиц откручивать крестовой отвёрткой. Кодер выучит наизусть стандарт, но это ведь не сделает его инженером. Печатная машинка ведь не учится как нейросеть. Инженер (программист в частности) это стиль мышления, направленный на понимание каким инструментом пользоваться в определенной ситуации, а кодер это умение инструментом пользоваться.
@@SecondChan именно это и хотел сказать
@@SecondChan "Программист - это склад ума" - тотал булшит. Программирования - это такая же профессия как большинство остальных, в которых требуется квалификация. Инвестируешь тонну часов - становишься профи, как и везде.
А разве это не нормально?
Тех же типичных электриков и сантехников, на порядок больше чем инженеров(настоящих, а не просто дипломированных) соответствующей сферы.
Чуть дай им нетипичную задачу и они словят забор.
Так же и здесь. Не каждый приложит руку к созданию ракеты - гайки тоже кто-то крутить должен.
за некропостинг соре
Чего то в гите ничего нет.
двоякое впечатление - с одной стороны объяснил, почему он не понятен из книги. С другой стороны код на гихабе - я не знаток шарпа, но разве было обязательно создавать 100500 файлов в каждом варианте?
Голова болит
топ топ топ топ топ топ
Кто сильнее гопник, алкаш ил. Эксбиционист
Ну и фантазия у тебя, лечится надо
douuuuu
Го некст паттерн
как я вообще сюда попал.
Drachun
Чуваки, но это ж не фабричный метод ( плак
По моему это Абстрактная Фабрика
Вообще ничего не понятно. что за бред?
Заебцом
Ничего не понятно.
это не фабричный метод) он проще)
Да вообще помойму копировать в тупую код от куда то ни было дорога в никуда, с ездой на одном месте, какого бы уровня ты ни был
Дружище, нравится твои видео, но тут просто эпик фэйл, потому что фабричный метод это совсем не то, что ты тут описываешь. Может хватит пилить видосы в 4 утра, лучше проспись.
Вабще пофиг.
эммм обычный логический подход епта
зашумил восприятие матом и мемасиками, ничего не объяснил
Слава Украйини
FactoryMethodLesson/CoolGood/Factory/Program.cs 34 строка комент с ошибкой( не благодари)