C# Factory Method Фабричный Метод | Design Patterns

  Рет қаралды 38,046

codaza

codaza

Күн бұрын

Паттерны проектирования важно и нужно знать. В этом ролике мы поговорим про design pattern Factory Method (Фабричный метод) - порождающий шаблон проектирования. Поговорим о сути, посмотрим на примеры и сделаем реализацию в Visual Studio 2022 и .NET 6. Заходите, будет интересно и станет понятно 🙂
Исходный код проекта на GitHub: github.com/codaza/FitnessClub
Telegram канал: t.me/codaza
На кофе ☕️: pay.cloudtips.ru/p/179d0532
Patreon: / codaza
Boosty: boosty.to/codaza
0:00 - Начало
0:48 - Factory Method это порождающий паттерн
1:25 - Концепция Factory Method
6:52 - Недостатки Factory Method
8:07 - Анатомия Factory Method
9:59 - Live example
10:52 - Пример: Создаём проект в Visual Studio 2022 (.NET6)
11:18 - Пример: Создаём абонементы
16:47 - Пример: Создаём фабрики
22:24 - Пример: Используем фабрики в клиентском коде
32:33 - Завершение
#factorymethod #designpatterns #ityoutubers #ITubeTeam #gof #csharp #net6 #паттерныпроектирования #codaza

Пікірлер: 145
@codaza-channel
@codaza-channel 2 жыл бұрын
Удобная навигация по видео :) 0:00 - Начало 0:48 - Factory Method это порождающий паттерн 1:25 - Концепция Factory Method 6:52 - Недостатки Factory Method 8:07 - Анатомия Factory Method 9:59 - Live example 10:52 - Пример: Создаём проект в Visual Studio 2022 (.NET6) 11:18 - Пример: Создаём абонементы 16:47 - Пример: Создаём фабрики 22:24 - Пример: Используем фабрики в клиентском коде 32:33 - Завершение
@tarlanismailov5228
@tarlanismailov5228 2 жыл бұрын
На мой взгляд было бы неплохо, если бы вначале урока была определена проблематика: то есть код без применения какого-либо паттерна, а уже потом можно было бы увидеть пользу от использования паттерна. Но все равно уроки очень полезные. Спасибо!
@codaza-channel
@codaza-channel 2 жыл бұрын
Да, это очень хорошая идея. Я подумаю над этим. Спасибо!
@voffkaboo7183
@voffkaboo7183 2 жыл бұрын
один из лучших каналов по программированию, которые я видел за последние пару лет. Спасибо за ваш огромный труд)
@codaza-channel
@codaza-channel 2 жыл бұрын
Всегда приятно читать такие комментарии, они очень мотивируют. Я рад, что видео оказываются полезными и нравятся. Спасибо за комментарии, они очень помогают каналу 🙂👍
@aleksalex1479
@aleksalex1479 2 жыл бұрын
Каждое новое видео на этом канале не только источник знаний, их ещё и приятно смотреть и слушать. Спасибо!
@codaza-channel
@codaza-channel 2 жыл бұрын
Благодарю за высокую оценку. Надеюсь и дальше радовать познавательным контентом. Впереди много интересного!
@marksreider7645
@marksreider7645 2 жыл бұрын
Спасибо за ваш труд, ваш канал источник знаний C#
@codaza-channel
@codaza-channel 2 жыл бұрын
Я очень рад, что канал оказался для вас хорошим источником знаний по C#. Вам большое спасибо за комментарии под роликами и поддержку, это очень сильно помогает каналу. Впереди много интересного 🙂👍
@BrownAleks
@BrownAleks Жыл бұрын
Суть понимания этого паттерна, ко мне пришла именно из этого ролика. Посмотрел с удовольствием. 👍👍👍👍👍👍
@phat80
@phat80 2 жыл бұрын
Как всегда отлично!
@qnet1080
@qnet1080 2 жыл бұрын
То что нужно , идеально . Спасибо . Вы лучшие!
@user-zi2fh7zp1q
@user-zi2fh7zp1q Жыл бұрын
Просто невероятно круто. Много моушен графики, дизайна самого ролика. Музыка, оформление, цвета, выверенный голос. Здесь всё идеально. Я молчу про содержание - это и так понятно любому, кто сюда зашел. Даже не будем останавливаться. Так паттерн никто не разбирал. Тема ультра не для всех - это не учить, что такое string и набирать миллионы просмотров. Здесь делается колоссальная работа для людей кто в теме, а таких мало. Большое Вам человеческое спасибо за Ваши труды.
@RageBerry_
@RageBerry_ 2 жыл бұрын
Спасибо за труд, видос зашёл на "ура", буду ждать новых роликов и выделять время и силы на те, что уже есть
@yanutsh
@yanutsh Жыл бұрын
Шикарное описание паттерна. От Концепции до примера Реализации!!! Наконец-то стало все понятно, хоть я пишу не на С а на PHP. Большое спасибо. Подписался. Буду искать объяснений других шаблонов.
@youchinafriend
@youchinafriend 2 жыл бұрын
Шикос, спасибо большое 👍🏻💥
@interjacksoninter6310
@interjacksoninter6310 2 жыл бұрын
Спасибо за выпуск, всё понятно и доступно!!! Ждём продолжения про абстрактную фабрику, к примеру)))
@aarongrimes9276
@aarongrimes9276 2 жыл бұрын
Спасибо за видео, как всегда отлично
@ArconWell
@ArconWell Жыл бұрын
Я всё ещё жду разбор остальных паттернов проектирования 😁 Вам удаётся максимально простым языком говорить о сложных вещах. Такое мало кому под силу
@postman2084
@postman2084 Жыл бұрын
Присоединяюсь, очень жаль что нового ничего нет (
@6trica1a3
@6trica1a3 2 жыл бұрын
Реально круто делаешь Паттерны с тобой реально понятны💪
@user-gf9ey9be1o
@user-gf9ey9be1o 5 ай бұрын
Спасибо большое, это лучшее объяснение, которое я видел. 👍👍👍
@_MrMaser_
@_MrMaser_ 2 жыл бұрын
Спасибо большое codaza, долгое время не мог понять как этот паттерн работает, спасибо большое!
@codaza-channel
@codaza-channel 2 жыл бұрын
Пожалуйста! 🙂 Спасибо, что смотрите и оставляете комментарии. Очень рад, что понимание работы паттерна пришло после просмотра этого ролика 💙
@NoL1nker
@NoL1nker Жыл бұрын
По праву один из лучших каналов по программированию в целом и C# в частности. Большинство ориентированы на новичков, что на самом деле не всегда хорошо. Огромное спасибо, за одно видео почерпнул массу полезной и нужной информации!
@user-jw9uf3vu4y
@user-jw9uf3vu4y Жыл бұрын
очень понятное и интересное видео, спасибо!
@mathew9794
@mathew9794 Жыл бұрын
Просто отличное пояснение. Большое человеческое.
@ANTONY-vk3pu
@ANTONY-vk3pu 2 жыл бұрын
Продолжай пожалуйста, очень понравилось, отличный канал!!!
@vladisslavss
@vladisslavss Жыл бұрын
Отличное объяснение! спасибо за видео! Лукас и коммент в поддержку автора канала!
@user-wu8zt4we5n
@user-wu8zt4we5n Жыл бұрын
Хорошее видео. Спасибо.
@user-sp1gr6xb7q
@user-sp1gr6xb7q 7 ай бұрын
Спасибо чувак, не думал что можно учиться не насилуя свои мозги. Очень приятно подаешь
@user-hg5mt8lz2y
@user-hg5mt8lz2y 2 жыл бұрын
Спасибо, всё понятно
@777homosapien
@777homosapien Жыл бұрын
Надо поменять "И выведем информацию клиенту" на "И схватим nullreference ". А описание отличное! Спасибо!
@viktorkobylyanskyy102
@viktorkobylyanskyy102 2 жыл бұрын
Продолжайте пжлст не остонавливайтесь, для новичков очень хорошо что есть хоть какие то примеры, потому что часто неясно вообще зачем все ети штуки нужны. Учишь что то, типо лямбда выражений, паттернов, асинхронного программирования и тд, а на фига ето нужно в итоге не понятно вообще.
@vladbush8718
@vladbush8718 2 жыл бұрын
Мужик,спасибо тебе большое за то что ты делаешь от всего нашего сообщества! Я со знакомыми программистами разбираем разные темы по программироварию и частенько смотрим разные источники(сайты с документациями на разных языках,по видео,по сайтам,на русском лучший metanit ,и твоя падача лучше чем у всех на русском ютубе. Я уверен,что сложно так качествено делать,спасибо тебе😁)
@codaza-channel
@codaza-channel 2 жыл бұрын
💙
@user-nw1jq3ie9t
@user-nw1jq3ie9t 2 жыл бұрын
Спасибо за видос. По мимо фабрики, еще и за switch. Ото по привычке case..break использую )
@nobodynemo9556
@nobodynemo9556 Жыл бұрын
Понимание этого патерна пришло именно из этого ролика, спасибо :)
@habel2446
@habel2446 Жыл бұрын
Один из лучших каналов
@user-yo7mw6oj4p
@user-yo7mw6oj4p 2 жыл бұрын
Спасибо. Очень сегодня пригодилось.
@codaza-channel
@codaza-channel 2 жыл бұрын
Пожалуйста :)
@user-ld3zm5tv6w
@user-ld3zm5tv6w 2 жыл бұрын
Комент для продвижения. Автор красавчик.
@petrodyak
@petrodyak 2 жыл бұрын
Спасибо за класное обьяснение этого патерна. Очень просто и в то же время наглядно на примере (то что надо для програмvиста- спортсмена :) )
@codaza-channel
@codaza-channel 2 жыл бұрын
Спорт только приветствуется 👍 Рад, что видео оказалось полезным!
@TheKovalAndrey
@TheKovalAndrey 2 жыл бұрын
Спасибо, не такой уж и сложный паттерн. Понял ;)
@justraccoon3047
@justraccoon3047 Жыл бұрын
Ля, ну очень крутое и понятное видео. Сложная тема, но у тебя очень понятное объяснение. Очень бы хотелось увидеть видео по остальным паттернам.
@user-ht1uh2xf6t
@user-ht1uh2xf6t 11 ай бұрын
Не знаю, уравновешенный ли человек это придумывал, но без навыка "МАНИЯ", такое придумывать не охото) 4:36. Спасибо, ты супер отлично объясняешь.
@dazl974
@dazl974 2 жыл бұрын
Было бы неплохо, если бы ты объяснил конфигурацию через IConfiguration.
@loam
@loam Жыл бұрын
А мне сразу на ум для приведенного примера шаблон декоратор пришел...
@user-zu1tm4mo2k
@user-zu1tm4mo2k 2 жыл бұрын
Узнал по голосу) брал курс на юдеми) огромный респект! Наконец стало понятно, что эта фабрика довольно прозаичная штука)
@codaza-channel
@codaza-channel 2 жыл бұрын
Здорово, что видео оказалось полезным. Вероятно Вы обознались, так как я не выкладывал курсов на Udemy. А что за курс? Интересно послушать голос, который Вам показался схожим с моим 🙂
@user-zu1tm4mo2k
@user-zu1tm4mo2k 2 жыл бұрын
@@codaza-channel на udemy курс Программирование на c# от новичка до специалиста. Илья Фофанов. Очень похожие голоса
@codaza-channel
@codaza-channel 2 жыл бұрын
Спасибо. Нет, не я :) У Ильи есть свой канал на KZfaq.
@user-zu1tm4mo2k
@user-zu1tm4mo2k 2 жыл бұрын
@@codaza-channel так, или иначе, Ваша подача материала просто прекрасна)
@_MrKekovich
@_MrKekovich 10 ай бұрын
Какой же офигенный контент. Мне очень нравится подача и огромная ценность информации. Спасибо!
@_MrKekovich
@_MrKekovich 10 ай бұрын
Забыл ещё то, что это не только к C# принимается, но и ко всем языкам, которые поддерживают современное ООП
@dazl974
@dazl974 2 жыл бұрын
Также, я думаю, было бы интересно узнать как и зачем использовать асинхронные методы (async await)
@toks1396
@toks1396 Жыл бұрын
Больше года прошло с вопроса, не знаю актуален ли ответ, но все равно напишу. Асинхронные методы нужны для того, чтобы не загружать поток работой ожидания ответа от IO, т.е. когда фактически поток не работает, но и не отпускает выделенный ему планировщиком квант времени. Синхронное ожидание IO операций плохо, поскольку в пустую загружает систему. Лично мне всегда было проще понимать на примерах и аналогиях, поэтому предложу такой пример. Ты живешь в квартире с тремя друзьями (снимаете квартиру на 4х). Вас в квартире четверо - представь, что каждый из вас - это "поток". Квартира - "процесс" (это не совсем так, но чисто для простоты). Т.е. в одной квартире есть 4 потока. Каждый из вас может делать какую-то работу (Task), а может ничего не делать, отдыхать. Вы проголодались и решили заказать пиццу. Т.е. появилась задача (получить пиццу чтобы можно было ее съесть). Задача состоит из нескольких частей: заказать пиццу (реальная работа для одного из вас), подождать курьера (работает курьер, вы в это время не задействованы), встретить курьера и принести пиццу на стол (реальная работа для кого-то из вас). Как будет выглядеть синхронный вариант: один из вас позвонил в пиццерию, сделал заказ, и сел ожидать курьера. Пока он ждет курьера, он вроде ничего не делает, но при этом отказыватся делать что-то другое (накрывать на стол, помогать вешать полку и т.д.). Т.е. просто сидит, уставился в стенку и ждет звонка. У вас в квартире в этот момент, с некой долей упрощения, стало всего 3 свободных потока, т.е. вы одновременно можете делать 3 задачи. И если у вас большой список задач (даже мелких), вам на 3х их разгребать стало сложнее, а этот мерзавец сидит и пялится в стену! Асинхронный вариант: один из вас позвонил в пиццерию, сделал заказ, но не сел ожидать курьера, а продолжает делать какие-то дела по дому. В тот момент, когда поступит звонок от курьера, он (либо любой из вас, зависит от контекста синхронизации) - выйдет встречать курьера и принесет пиццу. Получается, что на момент ожидания курьера, вы не лишились одной рабочей силы и так и продолжали делать одновременно 4 задачи. Тот, кто заказывал пиццу, смог сделать много мелких задач пока не поступил звонок от курьера. Модель очень упрощенная, но должна более-менее отражать суть асинхронности. Все это нужно чтобы система не деградировала, ожидая ответа от внешних устройств (или сервисов) - всякие запросы к базам данных, api, ожидание сообщения в шине данных и тому подобное.
@WestPicturesStudio
@WestPicturesStudio 7 ай бұрын
Я нашел закодированное послание на 25:20! ты на самом деле GPT! (если тебя держат в заложниках, ты знаешь что делать;)
@vasikkot4083
@vasikkot4083 Жыл бұрын
Незаслуженно малое количество подписчиков
@user-hq5vd5ul3i
@user-hq5vd5ul3i 2 жыл бұрын
Спасибо) отличное объяснение!!! Единственное чисто интуитивно мне бы захотелось конструктить все эти фабрики не в клиентском коде а в каком ни будь статическом методе на базовой фабрике, но не знаю на сколько это ок...
@codaza-channel
@codaza-channel 2 жыл бұрын
Благодарю за комментарий. Рад, что видео оказалось полезным. Ваша интуиция даёт верный совет :) Обычно, создание фабрик выносят в отдельные вспомогательные классы, которые содержат минимум логики. Как раз именно эти вспомогательные классы подлежат внесению изменений при появлении новых фабрик.
@morozovua
@morozovua 6 ай бұрын
Может мой коммент покажется душным, но задачу с абониментами надо было бы решать паттерном декторатор и все эти вещи типо бассейна и т.д. делать отдельными сущностями которыми можно было бы расширять сущность Gym
@ibragimProtopopov
@ibragimProtopopov Жыл бұрын
В данном примере мы создаем фабрику, а в ней конкретный класс, почему мы не можем создать сразу конкретный класс? или фабрики еще будут расширяться и в самой фабрике будет еще свич в зависимости от параметра?
@Ar6yZuK
@Ar6yZuK Жыл бұрын
Жаль не могу два лайка поставить
@gleb_rr
@gleb_rr 4 ай бұрын
Спасибо большое!!! Остался один небольшой вопрос: где должна находиться папка factories, которая создает объекты Domain, если приложение MVVM? (Domain, Infrastructure, Bootstrapper, ViewModel)?
@tarlanismailov5228
@tarlanismailov5228 2 жыл бұрын
9:29: тут, видимо, опечатка, так как, насколько я понял, вовращаемый тип в factoryMethod в классе AbstracFactory должен быть IProduct?
@codaza-channel
@codaza-channel 2 жыл бұрын
Да, разумеется. Благодарю Вас за внимательность.
@user-dz4gv2md2p
@user-dz4gv2md2p Жыл бұрын
20:50 - ну а где звук?
@FixedA
@FixedA Жыл бұрын
Осталась ли необходимость в данном паттерне когда есть внедрение зависимостей?
@dzianisshcharbakou145
@dzianisshcharbakou145 Жыл бұрын
Спасибо за видео, но все же есть вопрос к методу GetFactory(string membershipType) на клиенте, разве он не нарушает принцип открытости закрытости? или здесь имеется ввиду, что этот метод должен быть из стороннего источника, а мы его просто используем?
@codaza-channel
@codaza-channel Жыл бұрын
Да, нарушает. Но в этом конкретном месте это некритично, так как это точка вход в программу, где мы даём пользователю выбор абонемента, который нужно создать. Здесь важно понимать, что нельзя написать код, который на 100% будет соответствовать принципам SOLID. Всегда будут существовать "узловые точки", где принципы должны быть нарушены по тем или иным причинам. Интерфейсная логика является одной из таких "узловых точек".
@codemystery
@codemystery Жыл бұрын
Видео информативное и крутое, спасибо! Почему не пользуетесь предложенными студией подсказками, по большей части, то что она предлагает, Вы и пишите?
@codaza-channel
@codaza-channel Жыл бұрын
Благодарю за обратную связь. В комментариях под другим видео уже задавали этот вопрос, я продублирую мой ответ: Причина по которой я стараюсь не пользоваться быстрыми действиями состоит в том, чтобы зритель видел развитие мысли в процессе написания кода без резких “скачков”, которые эти действия создают. На канале люди с разным уровнем подготовки и начинающих разработчиков такие “фокусы” также могут смущать.
@TheCry412
@TheCry412 2 жыл бұрын
Спасибо тебе за хорошее объяснение. Слушай, можешь помочь, как обработать вариант, если пользователь введет неверную букву(не g,p,t) ну или вообще ничего не введет. Сколько я пытаюсь у меня не получается.
@codaza-channel
@codaza-channel 2 жыл бұрын
Попробуйте подписаться на событие изменения текста в поле ввода и использовать регулярное выражение для фильтрации вводимых символов.
@mykhailoskachkov5946
@mykhailoskachkov5946 Жыл бұрын
Видео классное, но сам пример имхо неудачный. В данной ситуации все то же самое можно было бы сделать без фабрик вообще с единым оператором switch. Поэтому как по мне, то суть паттерна как раз не раскрыта. Лучшим примером был бы акцент на каком-то алгоритме, сделанном в общем виде, где автоматом создаются объекты и акценте на том что код этого алгоритма не меняется никогда и вот для того чтобы он не менялся нам на определенном этапе нужны эти фабрики . ну и да, конструкторы у классов для наглядности лучше было бы сделать разными, чтобы собственно и показать что где надо, вызывается кастомный код (внутри фабрик), а где надо, вызывается код в общем виде (внутри алгоритма). Мне кажется эти акценты в видео если и есть, то сделаны неочевидными.
@qwww..8628
@qwww..8628 2 жыл бұрын
Добрый день. Можете пояснить почему вы использовали интерфейс, а не абстрактный класс для создания абстракции "продукта"?
@codaza-channel
@codaza-channel 2 жыл бұрын
Добрый день. Интерфейс используется ввиду отсутствия необходимости общей логики работы "продуктов". Если бы в "продукте" нужно было сделать расчёт базовой стоимости, то мы могли бы прибегнуть к использованию абстрактного класса.
@mihaylo47
@mihaylo47 Жыл бұрын
смотреть можно только на 1,25 скорости. На двадцатой минуте пропадает звук на несколько минут. Окей, я понял как организовать фабрику, но так и не понял, зачем, с тем же успехом я мог создать в методе GetFactory сами классы GM, GPPM, PTM без фабрик, напрямую. Зачем столько работы, с какой целью?
@KislyEmb
@KislyEmb Ай бұрын
В видосах 90% воды. Более того в данном примере фаблика выпускает только один тип обьектов.. если бы фабрика выпускала колеса, то на каждый тип протектора и диаметра и тд пришлось бы строить еще одну фабрику..
@ig6187
@ig6187 2 жыл бұрын
Спасибо за канал. Фоновая музыка имхо немного громкая
@codaza-channel
@codaza-channel 2 жыл бұрын
Спасибо за комментарий и обратную связь. Если не трудно, можете скинуть парочку ссылок на ролики с других каналов, где фоновая музыка вам кажется комфортной? Постараюсь поработать над этим 🙂
@ig6187
@ig6187 2 жыл бұрын
@@codaza-channel Ответил отдельно.
@codaza-channel
@codaza-channel 2 жыл бұрын
Благодарю за хорошие чаевые ☕️ Поработаю над уровнем громкости 🙂
@sportshomeworkout3834
@sportshomeworkout3834 Жыл бұрын
DotNet_6 рулит
@IIIA_KO
@IIIA_KO 2 жыл бұрын
Спасибо за урок. Я изучаю программирование уже второй год и вот пришел к изучению паттернов. Неясным для меня осталось только одно: зачем создавать абстрактную фабрику, когда можно создать конкретные для каждого типа? Все равно ведь работа будет выполнена та же самая
@codaza-channel
@codaza-channel 2 жыл бұрын
В базовом классе (в нашем случае MembershipFactory) мы можем определить общую логику (если она необходима) для конкретных фабрик. Кроме того, базовый класс необходим для унификации работы с создаваемыми фабриками, так как вам может потребоваться отложенное (lazy) создание объекта.
@IIIA_KO
@IIIA_KO 2 жыл бұрын
@@codaza-channel Понял, спасибо большое
@MrKingofTiger
@MrKingofTiger Жыл бұрын
Интересная комбинация. Горит с того, что не пользуешься подсказками, что вместо Console.WL пишешь полные названия и вообще игнорируешь любые подсказки, но с другой стороны приятная музыка, голос и отличная подача материала. За второе однозначно лайк. Было полезно
@codaza-channel
@codaza-channel Жыл бұрын
Благодарю за обратную связь. В комментариях под другим видео уже задавали этот вопрос, я продублирую мой ответ: Причина по которой я стараюсь не пользоваться быстрыми действиями состоит в том, чтобы зритель видел развитие мысли в процессе написания кода без резких “скачков”, которые эти действия создают. На канале люди с разным уровнем подготовки и начинающих разработчиков такие “фокусы” также могут смущать.
@clutchmeisteryo9831
@clutchmeisteryo9831 2 жыл бұрын
Хорошо, объясните что мне мешает создать метод, который инкапсулирует в себе тот же switch case и в зависимости от ввода создаёт мне нужный класс? Чем этот вариант хуже реализации этого паттерна?
@codaza-channel
@codaza-channel 2 жыл бұрын
Пример сильно упрощен, чтобы дать понимание структуры и взаимодействия классов. В реальных задачах, создание абонемента может быть весьма сложным процессом и подобное упрощение приведет к перегруженности клиентского кода, которому нужно знать все детали реализации создания всех абонементов. Таким упрощением вы нарушаете принцип единственной ответственности (Single Responsibility Principle), описываемый в SOLID.
@user-gp2gr4ze1v
@user-gp2gr4ze1v 7 ай бұрын
У меня было впечатление, что фабрика несколько сложнее. А тут получается, что логика, которая обычно описывается в сервисе или коре, выносится и разбивается по различным реализациям фабрики.
@sergeymigel4680
@sergeymigel4680 Жыл бұрын
все понял. так банально, что аж разочарован немного)
@king_fox_3106
@king_fox_3106 2 жыл бұрын
Чувак, очень круто объясняешь, но я всетаки так и не понял, зачем создавать кучу одинаковых классов выполняющих одно и то же действия, только с разными реализациями... Сейчас пытаюсь адаптировать код для своей игры на Юнити (Создание вещей с разными типами сущности, Предмет, животное, растение) и что то не клеится у меня с тем, что ты показал в примере. Я реализую абстрактный класс Фабрики и интерфейса в Фабрике сущьности, это уже выходит за рамку паттерна?
@codaza-channel
@codaza-channel 2 жыл бұрын
Множество классов-фабрик необходимо для инкапсуляции логики создания бизнес-сущностей. Такой подход позволяет соблюсти принципы SOLID и сделать код читаемым и анализируемым. Если не следовать правилам паттерна, а пытаться "намешать" всю логику фабрик в одном месте, то мы получим, так называемый, "спагетти код". Касательно вашего вопроса, мне трудно оценить необходимость добавления интерфейса, так как я не владею всеми нюансами вашего домена, но точно могу сказать, что не стоит придерживаться всех канонов паттерна и, если вы видите необходимость в интерфейсе, то смело добавляйте его в вашу реализацию. Паттерн - это типовое решение для типовых проблем и, если вам нужно адаптировать его под свои нужды, просто делайте это.
@user-wy8gk7tq4p
@user-wy8gk7tq4p 4 ай бұрын
В примере с фитнес клубом, зачем нам нужны прослойки классы-фабрики, если логику создания экземпляров IMemberahip можно поместить внутрь классов наследников? Чем больше изучаю фабричные методы, тем больше не понимаю их реальную пользу. Дополнительные поражения для усложнения кода.
@nytakoe6156
@nytakoe6156 3 ай бұрын
Полностью согласен, начал изучать и не понимаю, зачем прослойка в виде классов-фабрик... Можно просто без них обойтись, паттерн от этого никак не изменится. А в плане пользы, есть хороший пример с логгером: kzfaq.info/get/bejne/rrynitiWprPPkZs.htmlsi=-3DvgND3QG0x2X5G
@saldy723
@saldy723 2 жыл бұрын
Правильно ли понимаю, что абстрактный метод, это реализация той же стратегии, но с необходимостью делигацией создания объектов?
@codaza-channel
@codaza-channel 2 жыл бұрын
Не думаю. Стратегия и Фабричный Метод - два независимых паттерна, которые решают разные задачи. Кроме того, Стратегия является поведенческим паттерном, а Фабричный Метод - порождаюшим паттерном. Попробуйте использовать их на практике, чтобы лучше почувствовать назначение каждого.
@mattaku9430
@mattaku9430 Жыл бұрын
Не должны ли субклассы фабрики решать какой метод создавать? Метод придётся менять, если мы добавляем ещё один класс и фабрику
@danyka6974
@danyka6974 2 жыл бұрын
А какое преимущество у этого паттерна по сравнению с например определением какого нибудь статического класса с методом IMembership GetMembership(Type) где Type - enum. Сам метод возвращает нужный нам объект, внутри тела метода все тот же switch case который в зависимости от значения Type вызывает один из приватных методов внутри класса который и конструирует объект. Т.е. тут вообще нет никаких фабрик, для расширения функционала все что надо это добавить новый метод и все.
@codaza-channel
@codaza-channel 2 жыл бұрын
Спасибо за отличный вопрос. Вы описали как раз тот случай, из-за практики применения которого, пришли к необходимости создания паттерна Factory Method. Если сделать статический класс таким, как вы его описали, то мы получим так называемый "God Object". Приведу определение из Wikipedia (если не слышали про это): Боже́ственный объе́кт (англ. God object) - антипаттерн объектно-ориентированного программирования, описывающий объект, который хранит в себе «слишком много» или делает «слишком много». Таким образом, мы сразу же создадим себе множество проблем, главная из которых - нарушение принципа открытости/закрытости. Если нам потребуется изменить принцип создания какого-нибудь объекта, мы всегда будем делать это в этом большом статическом классе. Кроме того, просто представьте что будет с этим классом если у вас будут десятки сложно-конструируемых объектов, весь код превратится в нескончаемую лапшу трудную для анализа и понятную только её создателю. Выделяя логику создания в отдельные фабрики, мы инкапсулируем её в них, тем самым делая код читаемым и пригодным к проведению unit-тестирования. И конечно же сам фабричный метод - возможность централизованного выделения базовой логики для создания объектов.
@neu2229
@neu2229 2 жыл бұрын
@@codaza-channel а почему код который написали вы не нарушет принцип открытости-закрытости? Вы же пишете Switch-Case который так или иначе будете раширять при добавлении нового типа абонимента. Это уже ключевое нарушение этого принципа. Разница лишь в том, что в фабриках это более структурированый код. Но это никак не убирает нарушение open-closed принципа. Или что тут я не так понимаю?
@codaza-channel
@codaza-channel 2 жыл бұрын
@@neu2229 Вы правы в том, что в части switch-case принцип открытости/закрытости нарушается. В данном случае это считается нормальным, так как это часть клиентского кода, где нет логики создания абонементов, так как она располагается в соответствующих фабриках. Однако, даже в этом случае, при необходимости, мы можем этого избежать используя рефлексию.
@tupoy_ytub_uberi_psevdonim
@tupoy_ytub_uberi_psevdonim 5 ай бұрын
С 19 по 22 минуту резко пропадает весь звук
@user-fq6ts8kx2r
@user-fq6ts8kx2r Жыл бұрын
20:51 звук пропал 22:30 вернулся
@ermekbakyt5507
@ermekbakyt5507 2 жыл бұрын
Eto u vas Abstract Factory pattern ili Fatcory Method pattern?
@codaza-channel
@codaza-channel 2 жыл бұрын
Factory Method
@Tleu13
@Tleu13 Жыл бұрын
@@codaza-channel странно я до конца не стал смотреть но даже на картинке в начале у вас у каждого абонемента по фабрике и над ними ещё одна фабрика. Возможно все же вы сделали пример абстрактной фабрики?)
@edwardfreedom
@edwardfreedom Жыл бұрын
что за плагин с подсказками
@rinatsadyev4649
@rinatsadyev4649 5 ай бұрын
Не понял зачем нужна посредник фабрика. Можно же создавать абонементы так же через switch без фабрики.
@uprekayshiy_goose
@uprekayshiy_goose 3 ай бұрын
Думаю в фабричном методе нужно добовлять ещё кучу разной логики
@EvgeniyYatsenko
@EvgeniyYatsenko Жыл бұрын
в российских реалиях собака нужна чтобы человек не тырил оборудование на чермет))
@ivnwngspn
@ivnwngspn 2 жыл бұрын
14:18 Почему мы не можем просто создать для имени свойство со стандартным геттером и приватным сеттером, а для цены стандартный геттер и инит сеттер? Зачем нам вместо этого какие-то уродские поля с подчеркиваниями? В случае со стандартными свойствами этот функционал можно было бы ещё и засунуть в интерфейс IMembership, определить там стандартную реализацию и перегрузить где надо, а не копировать один код во всех абонементах. Почему делается не так? Не понимаю этот момент.
@codaza-channel
@codaza-channel 2 жыл бұрын
Первое, что хочу отметить, “уродские поля с подчеркиваниями” - это общепринятая нотация в C# для private данных 🙂 Касательно ваших предложений: пример очень небольшой, поэтому тут возможны практически любые вариации без потери смысла, в том числе, предложенные вами.
@user-kl3kk7xg5b
@user-kl3kk7xg5b 2 жыл бұрын
Автору на будущее, в visual studio можно копировать файлы классов, а не каждый раз создавать новые, писать им название, и копипастить код. Без хейта, наоборот респект за открытые знания.
@Bushido_Cat
@Bushido_Cat Күн бұрын
Патерн выглядит очень громоздким и нагруженным, только не понятно ради чего это все стоит затевать, если тот же SwitchCase может порождать любой вариант - абонемент экземпляр класса по нажатию кнопки, без этой всей этой химеры 😪
@vitaliySobakinson
@vitaliySobakinson 10 ай бұрын
ГДЕ НОВЫЕ ВИДЕО??
@vitaliySobakinson
@vitaliySobakinson 10 ай бұрын
Дед, получишь по жопе! Делай видео!
@user-hh2qp6ez4d
@user-hh2qp6ez4d Жыл бұрын
Считаю, что все эти паттерны - баловство. В реальной жизни не до "фабрик". Надо сделать быстро, дешево, и так как хочет заказчик, а не программист.
@TedRed
@TedRed 7 ай бұрын
И это грустно. У нас закуток системы таким говнокодом написан, что пока разберешь как оно работает - пройдет половина дня. Если это хоть сколько-нибудь поддерживаемый проект в дальнейшем - писать не по паттерну себе дороже выйдет.
@vladbush8718
@vladbush8718 2 жыл бұрын
17:30 Почему GetMemberShip, а не GetIMemberShip кто-нибудь знает?
@codaza-channel
@codaza-channel 2 жыл бұрын
В C# принято именовать метод по объекту, который этот метод возвращает. GymMembership, PersonalTrainingMembership всё это Membership (абонемент). Да, они реализуют интерфейс IMembership, но добавление буквы I в название метода будет избыточным.
@user-ed6tq4vn8o
@user-ed6tq4vn8o Жыл бұрын
Вообще не очень понял целесообразность нескольких фабрик для каждого абонемента. Дублирование кода.
@codaza-channel
@codaza-channel Жыл бұрын
Пример сильно упрощен, чтобы дать понимание структуры и взаимодействия классов. В реальных задачах, создание абонемента может быть весьма сложным процессом и существенно отличаться для разных абонементов.
@redice8928
@redice8928 Жыл бұрын
Честно, не понял в чем суть фабрики, почему бы сразу не создавать абонемент? Вместо этого мы сначала создаем фабрику определенного типа, а потом через нее создаем абонемент соответствующего типа
@morozovua
@morozovua 6 ай бұрын
Плохой пример реализации. С таким же успехом можно было просто создать абонементы без избыточности
@DF-ov1zm
@DF-ov1zm Жыл бұрын
Паттерны, хуяттерны, бизнесс шмизнесс... чел, все, что тебе нужно было ответить на вопрос "нахера козе баян" в отношении фабрик - это: вам придётся их использовать, когда 1) в конструкторе дофига очень медленного говна, да ещё и костыльно синхронно асинхронного и вам больно смотреть на себя в зеркало от того говно кода, который вы накидали в конструкторы, прям спать не можете как и 2) когда вам нужно, что бы клиенту было фиолетово до того какие там реализации интерфейсов он запрашивает
@kitemanrus
@kitemanrus 2 жыл бұрын
Примитивный пример. Если выкинуть всё эти фабрики и в методе getFactory в свиче создавать непосредственно экземпляры классов абонементов получим тот же результат.
@codaza-channel
@codaza-channel 2 жыл бұрын
Пример взят для первого знакомства с паттерном Factory Method. Мне показалось, что рассмотрение более сложных процессов может отвести от понимания сути шаблона. Если Вам встречались более удачные примеры, буду рад если оставите ссылки. Мне будет интересно посмотреть на примеры, раскрывающие суть паттерна лучше. Так же это будет полезно для гостей канала, которые заглянули в комментарии 🙂
@kitemanrus
@kitemanrus 2 жыл бұрын
@@codaza-channel Я пытаюсь понять сакральный смысл этого паттерна ) Пока кажется, что ключевая идея это возвращение интерфейса, а не конкретного объекта конкретного класса. Сами же фабрики это просто некая обертка, смысл которой не совсем понятен.
@codaza-channel
@codaza-channel 2 жыл бұрын
“Возвращение интерфейса” (более корректно - “объект реализующий интерфейс”) - не является ключевой идеей, но это важный элемент позволяющий реализовывать её. Паттерн Factory Method позволяет отделить код создания (конструирования) отдельных объектов от остального кода, который эти объекты использует. При таком подходе, масштабирование (или расширение) кода, возможно проводить, не затрагивая кодовой базы, которая использует бизнес-объекты, создаваемые фабриками.
@grizzly805
@grizzly805 Жыл бұрын
вообще ничего не понятно🙃
@ahega0
@ahega0 Жыл бұрын
к сожалению, код в этом ролике не правильный, автор реализовал не фабричный метод, а абстрактную фабрику. те кто будет мне доказывать обратное - смотрите псевдокоды и читайте термин данного паттерна
@constantin3280
@constantin3280 9 ай бұрын
Нет, здесь реализован именно фабричный метод, но конкретно здесь лучше было бы реализовать абстрактную фабрику. В коде MembershipFactory объявляет фабричный метод GetMembership. Метод возвращает объект типа IMembership. Класс GymMembershipFactory переопределяет фабричный метод для возврата экземпляра GymMembership. IMembership интерфейс, который объявляет поведение продуктов, а GymMembership конкретный продукт, который реализует этот интерфейс.
@Bont1860
@Bont1860 Жыл бұрын
Очень красивая анимация и дизайн. Спасибо за ролик. Но очень бы хотелось небольшое дополнение, чтобы показать преимущества самого паттерна. Ведь самое главное, это то как мы его будем расширять и добавлять новые сущности. Ведь именно в этом удобства паттерна. Например я хочу добавить другое семейство сущностей - сотрудники. Для этого я создаю новый интерфейс для сотрудников в Domain, создаю класс сотрудник наследованный от интерфейса, а так же создаю новую абстрактную фабрику? Опять создаю все классы наследуемые от него. Не понятно в чем удобства всего этого.
@priest_2152
@priest_2152 Жыл бұрын
Представь, что вместо этого примера ты используешь сущности сотрудников как сущности для добавления в бд оператором твоей автоматизированной системы по управлению предприятием. Со временем штат предприятия растет, добавляется всё больше и больше сущностей. У каждой сущности свои обязанности, свойства и методы. А потом, через какое-то время, вы обнаружите что ваш код жестко привязан к самому факту существования этих сущностей. Эту проблему и решают паттерны, в том числе такие как фабричный метод. Мы можем описать в базовом классе для сущностей некий метод, который будет отвечать за конвертирование своей информации в понятный для пользователя вид (это всё условно, на самом деле так делать не стоит) - после этого вью будет всё равно с каким объектом ей работать, и наш код будет довольно резиновым. Можно промоделировать и ситуацию когда наш условный оператор хочет получить список сотрудников определенной должности из БД. В этом случае без фабричного метода нам все равно придется как-то реализовывать преобразование данных из бд в определенный список сущностей - это наплодит огромную кучу условных операторов, а при изменении одной из сущностей программа либо не скомпилируется из-за ошибки, либо будет вести себя не так, как мы этого ожидаем (что, я так полагаю, еще хуже). P.S: Данная ситуация очень притянутая, фактически здесь можно обойтись и другими паттернами и трюками. Но в этом и суть паттерном, что не получится подобрать универсальный под каждую ситуацию, они должны применятся очень точечно. Думаю в данной проблеме я бы использовал фабричный метод только для выгрузки сотрудников из бд.
@kyk0_924
@kyk0_924 6 ай бұрын
ничего не понятнно но очень интересно)
@fishbone_x
@fishbone_x 2 жыл бұрын
@codaza Не до конца понял зачем нам эта прослойка в виде всего что в папке Factories, разве нельзя было обойтись вызовом напрямую ? типо так: void Main() { ... IMembership membership = GetMemberShip(membershipType); ... } private static IMembership GetMemberShip(string membershipType) => membershipType.ToLower() switch { "g" => new GymMembership(100) { Description = "Description Gym" }, "p" => new GymPlusPoolMembership(250) { Description = "Description G+P" }, "t" => new PersonalTrainingMembership(400) { Description = "Description PT" } ... }
@codaza-channel
@codaza-channel 2 жыл бұрын
Пример сильно упрощен, чтобы дать понимание структуры и взаимодействия классов. В реальных задачах, создание абонемента может быть весьма сложным процессом и подобное упрощение приведет к перегруженности клиентского кода, которому нужно знать все детали реализации создания всех абонементов. Таким упрощением вы нарушаете принцип единственной ответственности (Single Responsibility Principle), описываемый в SOLID.
@fishbone_x
@fishbone_x 2 жыл бұрын
@@codaza-channel спасибо)
@nkochubashev
@nkochubashev Жыл бұрын
Почему вы не перенесете приватные поля класса в свойства, в коде ниже? Зачем создавать поля и методы, если можно создать только свойства? namespace FitnessClub.Domain { internal class GymMembership : IMembership { private readonly string _name; private readonly decimal _price; public GymMembership(decimal price) { _name = "Gym membership"; _price = price; } public string Name => _name; public string Description { get; set; } public decimal GetPrice() => _price; } Оптимизированный вариант: namespace FitnessClub.Domain { internal class GymMembership : IMembership { private readonly decimal _price; public string Name { get; } public string Description { get; set; } public decimal GetPrice() => _price; public GymMembership(decimal price) { Name = "Gym membership"; _price = price; } } }
C# Builder Строитель | Design Patterns
30:04
codaza
Рет қаралды 28 М.
Фабричный метод
15:48
Volodya Mozhenkov
Рет қаралды 59 М.
Nutella bro sis family Challenge 😋
00:31
Mr. Clabik
Рет қаралды 13 МЛН
когда повзрослела // EVA mash
00:40
EVA mash
Рет қаралды 4,5 МЛН
Жайдарман | Туған күн 2024 | Алматы
2:22:55
Jaidarman OFFICIAL / JCI
Рет қаралды 1,8 МЛН
C# Delegates Делегаты
18:14
codaza
Рет қаралды 83 М.
Паттерн Factory Method, Фабричный метод, С#, Unity
12:10
Асинхронное программирование на C# (блок 1)
1:01:53
Просто программист
Рет қаралды 6 М.
Factory Pattern in C# with Dependency Injection
1:07:33
IAmTimCorey
Рет қаралды 103 М.
Паттерн "прототип" на языке C#
20:34
Дмитрий Нестерук
Рет қаралды 17 М.
Шаблоны Java. FactoryMethod (Фабричный метод)
12:22
Eugene Suleimanov
Рет қаралды 93 М.
Марк Шевченко - Микросервисы на C#
1:02:10
Factory Method - Design patterns C#
22:14
CODE BLOG
Рет қаралды 25 М.