Тёмный

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

Eugene Suleimanov
Подписаться 28 тыс.
Просмотров 92 тыс.
50% 1

proselyte.net/
Шаблон: Фабрика (Factory Method)
=======================================================================================================
Цель:
Создание интерфейса, который создаёт объект. При этом, выбор того, экземпляр какого класса создавать
остаётся за классами, которые имплементируют данный интерфейс.
=======================================================================================================
Для чего используется:
Для делигирования создания экземпляров, другому классу.
=======================================================================================================
Пример использования:
- заранее неизвестно, экземпляры, какого класса нужно будет создавать;
- класс спроектирован таким образом, что создаваемые им объекты имеют свойства определённого класса.
=======================================================================================================

Опубликовано:

 

1 май 2016

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 215   
@ttampuom
@ttampuom 4 года назад
Не было пояснено, зачем вводить лишний уровень абстракции в виде фабрики. В рамках данного конкретного рассмотренного примера в клиентском коде вполне можно было в switch/case создавать конечные сущности в виде Developer минуя создание фабрики.
@_camper_5769
@_camper_5769 3 года назад
именно! Если вы поняли зачем это, то не могли бы вы объяснить?
@aleksey2793
@aleksey2793 2 года назад
@@_camper_5769 не зачем, прост. Притянуто за уши для демонстрации примера создания фабрики. В этом и печаль большинства блогеров-публицистов.
@qunemi
@qunemi 2 года назад
Рад тому, что увидел этот коммент, т.к. тоже не понимал, зачем этот уровень, если можно по слову сразу возвращаться нужного RandomLanguageDeveloper. Думал, что я не понимаю чего-то, но оказалось, что правильно подумал.
@malloc2497
@malloc2497 2 года назад
потому что switch/case нужно стараться избегать, вследствие одного из принципов solid, а точнее его второго принципа. при создании объекта, придется еще лезть под это switch и там добавлять условие, что не есть хорошо, на самом то деле.
@ttampuom
@ttampuom 2 года назад
Я согласен, что следует всегда минимизировать условную логику трансформируя такой код в полиморфизм иерархии наследования. Но в данном случае разве мы избавились от условной логики? Мы просто её переместили, а значит ровным счётом ничего не достигли.
@armorunit6970
@armorunit6970 Год назад
Самый понятный стиль объяснения. Вначале вступление, затем демонстрация сути решаемой паттерном проблемы, а затем её решение. Чётко, быстро и по делу. Спасибо!
@Tiertey
@Tiertey 4 года назад
Спасибо, всё понятно. Когда идёт последовательное усовершенствование кода с нуля до заданного шаблона, то всё идеально воспринимается (чем сразу написать правильный, но сложный код) :)
@shans-on
@shans-on 3 года назад
да, куда лучше чем в обьясняли
@feewre
@feewre Год назад
Теперь при добавлении нового наследника Developer, программисту придётся изменять не один, а целых два зеркальных класса, и один статичный метод с вермишелью из if else. Просто потрясающий шаблон! Советую ещё через методов 5 с разными спецификациями это всё прогнать, чтобы изменять ещё их, если кому мало
@antonsharykin-valianos9964
@antonsharykin-valianos9964 Год назад
Правильно, даешь супер-класс где все до кучи и авер 500 строк кода, вот так сразу все понятно будет
@sergiytychkin
@sergiytychkin 5 лет назад
Спасибо за труд. Самые понятные примеры.
@niener4176
@niener4176 2 года назад
Спасибо огромное за видео! Очень доходчиво объясняете, удивлена, что на Вашем канале мало подписчиков.
@EugeneSuleimanov
@EugeneSuleimanov 2 года назад
Спасибо за отзыв!
@user-gl9tr9nb1u
@user-gl9tr9nb1u 2 года назад
Превосходное объяснение фабричного метода. Просто лучшее из всех.
@ovusa
@ovusa 3 года назад
Спасибо за урок. Неделю учу этот паттер на англ и на русском,не понимала пока ваше видео не посмотрела!!!
@1glevan
@1glevan 3 года назад
Долго не мог понять, что за фабричный метод и зачем он нужен. На данном примере можно понять, что фабричный метод штука очень не сложная но в то же время полезная. Спасибо Евгений.
@EugeneSuleimanov
@EugeneSuleimanov 3 года назад
Спасибо за отзыв! Рад , что материал помог разобраться.
@JGolt
@JGolt 2 года назад
Спасибо большое за объяснение. Без практики довольно тяжело запоминать паттерны. Но Ваше объяснение даёт базовые понимания этого паттерна!
@EugeneSuleimanov
@EugeneSuleimanov 2 года назад
Спасибо за отзыв!
@VideoMaker1
@VideoMaker1 2 года назад
О, наконец-то разобрался с этим паттерном. Оказалось все легко) спасибо!
@dimitrishat8659
@dimitrishat8659 2 года назад
спасибо тебе добрый человек ! и английский у тебя тоже хороший. А то других слушаешь, уши заворачиваются в трубочку
@user-wv3ue4tu8u
@user-wv3ue4tu8u 3 года назад
Ты красавчик. Здоровья тебе и твоим близким!
@user-dx9yq5js2c
@user-dx9yq5js2c 4 года назад
Спасибо. Хорошо объясняете!
@user-vp2vg1ql4n
@user-vp2vg1ql4n 3 года назад
делегирование)) а так супер конечно! Хотелось бы еще несколько видосов для разъяснения ключевых различий между паттернами. Например прокси и декоратор. Спасибо за ваш труд.
@EugeneSuleimanov
@EugeneSuleimanov 3 года назад
Спасибо за отзыв :)
@stasleonov5196
@stasleonov5196 Год назад
Спасибо, отличное объяснение
@jacobmmm8260
@jacobmmm8260 3 года назад
Спасибо автору за видео. Все такие умные в комментах, а вот видео дельного совершенного никто не записал, а жаль. Можно было бы столько вариантов посмотреть и оценить по достоинству данный шаблон
@EugeneSuleimanov
@EugeneSuleimanov 3 года назад
Спасибо за отзыв!
@off6797
@off6797 8 лет назад
Ваще круть! Очень полезно было, как на пальцах) Если бы мог поставил 100 "пальцев вверх"
@user-er5uz4os1t
@user-er5uz4os1t Год назад
как ваши успехи в разработке спустя 6 лет?
@morph2049
@morph2049 7 дней назад
@@user-er5uz4os1t спился
@alexandralban5682
@alexandralban5682 6 лет назад
Да спасибо, очень интересно! )
@zagboris
@zagboris 4 года назад
Если я правильно понимаю, то еще смысл данного шаблона в том, что в аргументы методов можно добавлять экземпляр интерфейса, и тогда методу будет все равно какого в типа объект придет в момент выполнения программы.
@alexelektronik9220
@alexelektronik9220 2 года назад
Ты гений. Спасибо !
@user-jj2eu6yx6r
@user-jj2eu6yx6r 3 года назад
Крутой талант объяснять !
@EugeneSuleimanov
@EugeneSuleimanov 3 года назад
Спасибо за отзыв!
@Andrzej3935
@Andrzej3935 Год назад
Большое спасибо!
@dariaryzhykova3907
@dariaryzhykova3907 7 лет назад
Спасибо!
@EugeneSuleimanov
@EugeneSuleimanov 7 лет назад
Пожалуйста, Дарья.
@azerphoenix
@azerphoenix 3 года назад
Честно, лучшего объяснения этого паттерна не видел)
@volodya-nrg
@volodya-nrg 4 года назад
Красиво пояснил, молодец. Я понял.
@frosty7269
@frosty7269 2 года назад
Хорошо, что есть комменты, а то из видео вообще не понятно, что даёт данный паттерн и зачем он существует. А вот почитаешь комменты - станет понятно, что просто пример в видео не просто урезанный, а кастрированный, не отображающий сути паттерна.
@anjelomanoranjan
@anjelomanoranjan 7 месяцев назад
Женя, огромный тебе тебе респект. Ты оказывается еще владеешь С++?! Это вызывает большой уважение. Этот язык сложнее Java. После того как я освою Java, я очень хочу освоить С++. Мне кажется очень круто то, что этот язык может управлять железом. Все топовые игры пишутся на С++
@it-family-
@it-family- 5 лет назад
Спасибо! Я только запутался какая разница между Фабричным методом и Абстрактной фабрикой.
@notanord
@notanord 4 года назад
цель фабрик - создание ОБЪЕКТОВ и инкапсуляция создания объекта вне клиентского кода, тем самым мы освобождаем клиента от больших изменений кода (как показано на примере метода main), а все изменения инкапсулируем в объекте "фабрика", тем самым не нарушаем принцип открытости к расширению программы и закрытости к ее изменению уже существующего кода. Это фишка, которая предоставляет нам ООП. Используя Фабричный метод создаётся ОБЪЕКТ классами (JavaDeveloperFactory и PHPdeveloper factory), реализующими абстракцию (DeveloperFactory) для создания объекта интерфейса (Developer). Т.е. используется наследование для реализации этого метода. Абстрактная фабрика создаёт СЕМЕЙСТВО ОБЪЕКТОВ. Абстрактная фабрика используется с помощью композиции, т.е. создав в клиенте экземпляр абстрактной фабрики, ты задаешь создание всех объектов сразу, которые представляют собой одно семейство объектов (ингредиенты к блюду, виды цветов в одном букете, и тд). И используешь объекты этого семейства. Читай HeadfirstJava паттерны. Фабрика
@janm7034
@janm7034 3 года назад
Абстрактная фабрика, состоит из фабричных методов
@Kadabra1981
@Kadabra1981 5 лет назад
Прежде всего спасибо за ролик, суть кажется я уловил - вместо создания трёх классов с полезным кодом, мы городим ещё столько же классов прослоек и прослойки между прослойками - интерфейсы. И все это для того чтобы ленивые программисты излишне не утруждали себя если необходимо внести какие то изменения в основную логику работы программы.
@EugeneSuleimanov
@EugeneSuleimanov 5 лет назад
Прежде всего для того, чтобы создание по-настоящему сложных классов с множеством необходимых данных создавались одной строкой кода , а не простыней кода )
@OREH88
@OREH88 4 года назад
@@EugeneSuleimanov желательно было это и упомянуть в видео)
@vadelic
@vadelic 6 лет назад
Мудрёный вариант реализации, конечно, но видео отличное, спасибо
@eugenezaychenko8013
@eugenezaychenko8013 4 года назад
Все ок, понятно и доступно. Но лучше у фабрике сделать какой-то метод в который передаем "specialty" и при это нам вернут не фабрику, а уже девелопера.. Так же лучше использовать int значение или Enum вместо String для (specialty), ну и в самом методе createFactory проситься switch вместо ифов (но это уже вкусовщина). Но так все понятно.
@dimatarasiuk7842
@dimatarasiuk7842 7 лет назад
Спасибо Вам) Вы делаете очень полезные видео) Хотел спросить как сделать в IDE как у Вас что бы показывало UML diagrams?
@EugeneSuleimanov
@EugeneSuleimanov 7 лет назад
День добрый, Дмитрий. Спасибо за отзыв. Это стандартный плагин, который входит с Ultimate Edition. В Community его, к сожалению, нет.
@Dmitry2385
@Dmitry2385 4 года назад
@@EugeneSuleimanov Евгений, а есть ли достойная замена для Community Edition? По вашему мнению?
@EugeneSuleimanov
@EugeneSuleimanov 4 года назад
@@Dmitry2385 ultimate edition :) По моему мнению - Jet Brains делает лучшие IDE. А для Java - лучше IDEA точно нет.
@Dmitry2385
@Dmitry2385 4 года назад
@@EugeneSuleimanov Евгений, я имел ввиду uml plugin для idea Community edition.
@birds_channel
@birds_channel 6 лет назад
Factory и Factory Method это разные шаблоны Abstract Factory и Factory - вот что есть одно и то же. Еще Factory Method может называться Virtual Constructor
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
в каких источниках описан шаблон с названием Factory?
@user-pt9ed7ou2e
@user-pt9ed7ou2e 6 лет назад
Спасибо!!!
@EugeneSuleimanov
@EugeneSuleimanov 6 лет назад
Пожалуйста, Андрей. Спасибо за отзыв )
@regalnone7338
@regalnone7338 4 года назад
толково)
@user-hf1ih4bt2t
@user-hf1ih4bt2t 2 года назад
5 лет прошло, 21 год на дворе, но лучше объяснения на ютубе я не нашёл
@feewre
@feewre Год назад
И это прискорбно
@getteg6468
@getteg6468 4 года назад
вот это намудрил, нужно несколько раз пересмотреть, то мыли запутались под конец, а так норм)
@Onneaanable
@Onneaanable 5 лет назад
Нормально, но я в последнее время отказался от флагов в виде стрингов как в примере: java, c++, php, использую enum-ы. А так тема понятна, спасибо за видео.
@user-sj9kh4pf7n
@user-sj9kh4pf7n 5 лет назад
Тоже в голову мысль пришла ограничить варианты через перечисления.
@Onneaanable
@Onneaanable 5 лет назад
@@user-sj9kh4pf7n да, это норм практика, так можно не переживать, что кто-то, передаст что-то не то )))
@RikoRiko-zi1dk
@RikoRiko-zi1dk 4 года назад
Все советуют использовать только enum , в строке легко ошибиться , нежели в перечисление .
@II-ml5sx
@II-ml5sx 3 года назад
Можно ожидать Developer как параметр и передавать нужный класс и делать instanceof для нужной фабрики
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
здесь стринги как учебный пример, полагаю для упрощения восприятия
@hondashadow750phantom-penn3
@hondashadow750phantom-penn3 7 лет назад
Евгений, отличные видео, спасибо. Но есть вопрос. Так и не понял, какой выигрыш нам дает использование этого паттерна по сравнению с классическим полиформизмом (через интерфейс)? Все равно нужно менять тип вызываемого класса, причем в клиенте, так не все ли равно что менять, тип класса Developer или тип вызываемой фабрики? Я вижу только увеличение объема кода, кроме классов нужно создавать столько же фабричных методов... Спасибо
@EugeneSuleimanov
@EugeneSuleimanov 7 лет назад
Полиморфизм даёт нам позможность переопределять поведение класса, а фабрика отвечает за создание объектов. А код в клиентском классе является лишь примером использования.
@hondashadow750phantom-penn3
@hondashadow750phantom-penn3 7 лет назад
То, что код - это лишь пример, я понимаю. Не могу сообразить, чем создание объектов в фабрике предпочтительнее непосредственного создания объектов. И так, и так, для добавления новых классов или изменения типов объектов надо править код, вся разница, что без паттерна мы правим код в клиенте, а с паттерном - в классе фабрики. Что мы этим выигрываем? Или есть еще что-то, что я не понял?
@EugeneSuleimanov
@EugeneSuleimanov 7 лет назад
Tariel Regev Вероятнее всего, вы не сталкивались с по-настоящему сложными системами, в которых мы изначально не имеем всех данных для создания объекта, а получаем их из разных источников. Ведь, если нам необходима ссылка на какой-то объект SomeObject, то, намного разумнее поместить эту ссылку в фабрику а не в клиентский код.
@drankenwizard7602
@drankenwizard7602 4 года назад
Вроде как все понятно и просто, но осознать полезность этого подхода не получается. Было бы не плохо если бы кто-то объяснил именно этот момент
@OREH88
@OREH88 4 года назад
вот именно. а вообще взялся учить по этому сайту. вроде очень даже хороший refactoring.guru/ru/design-patterns/factory-method
@EllaLavrik
@EllaLavrik 4 года назад
Попробую пояснить полезность фабричного метода. Если в вашем коде будет много мест с "Developer developer = new JavaDeveloper". Представим 100 таких инициализаций класса. То когда вы захотите заменить JavaDeveloper на CppDeveloper, не смотря на то что вы использовали интерфейс, вам все равно придется сделать 100 изменений в коде. А фабричный метод инкапсулирует в себе инициализацию объекта определенного класса.(new JavaDeveloper) . Таким образом в данном кейсе вы заменяете "new JavaDeveloper" на "new CppDeveloper" только в одном месте внутри Фабрики, а в тех старых местах инициализации будет стандартный код "Developer developer = developerFabric.createDeveloper() "
@user-df9lg3og6z
@user-df9lg3og6z 4 года назад
@@EllaLavrik т.е. мы просто создаем "промежуточную переменную" , через которую идет создание новых объектов и когда нам надо поменять этот класс на другой мы типа меняем ссылку в этой переменной а все наши созданные объекты ее автоматом подхватывают? Правильно я понял? У меня один вопрос, а что так часто приходится изменять классы в реальных проектах? Вот только если нам надо просто добавить новый класс фабрика (из вышеприведенного примера) нам ни как в этом не поможет, т.к. кол-во приседаний от этого не уменьшается. Или я не прав?
@lighto263
@lighto263 3 года назад
@@EllaLavrik А каким образом с точки зрения количества кода создание 100 java девелоперов в фабрике проще?
@user-ei2vj8jv9u
@user-ei2vj8jv9u 3 года назад
@@lighto263 оно не проще. Суть именно в подходе к инициализации. Допустим(!!!), что программисту на ассемблере надо знать только ассемблер и архитектуру процессоров. То есть его инициализация состоит только в подготовке знаний самого ассемблера и АП. Всего две строки. А программисту на котлине надо знать Java Core, десяток библиотек и фреймворков, кучи паттернов, этой же кучи паттернов, но уже для Java и Kotlin, и собственно котлин. Например, инициализация такого программиста состоит из 20 строк. Итого, у нас получилась портянка IF'ов из 30 строк, и это только на два языка. Добавляем еще C++, C#, JS, TS - и, вуаля, у нас уже только стратегия выбора и инициализации программиста разрослась в 1000 строк трудноусвояемых условий. Читать такой код уже сложно. А в ходе развития задачи мы постоянно добавляем новые языки в эту, с позволения сказать, фабрику программистов. Паттерн "фабрика" же позволяет реализации создани и инициализации первичных параметров вынести в отдельный класс/объект. Каждый такой объект сам определяет, как ему создавать экземпляр - у кого-то пара строк, а у кого-то сотня, плюс хождения во внешние системы и тяжелая математика. А вот стратегия выбора способа создания конкретного программиста становится очень компактным и линейным кодом, который влазит уже в экран. Да, дальше можно стратегию сделать еще более "правильной", не требуя создавать портянку IF'ов, но это уже совсем другая история. Резюмируя, паттерн Factory нужен в первую очередь для улучшения читаемости, и снижения complexity кода.
@user-wq9gc4rj3w
@user-wq9gc4rj3w 2 года назад
Осталось ощущение что метод createDeveloperBySpecialy(String string) может с тем же успехом (работая на if else) возвращать готового девелопера, а не фабрику. Программа при этом будет работать так же, а мы избавимся от лишних 3-х классов и 1-го интерфейса.
@khvastov.maksym
@khvastov.maksym 2 года назад
Нет, это плохая идея. Для примитивного класса Developer может и годится (и то, так себе идея), для чего-то серьёзного - нет.
@smdfb7334
@smdfb7334 4 года назад
У меня только один вопрос. В каком случае нам может понадобиться создавать объекты с учетом того что мы работаем с ioc контейнером?
@user-og2ti2wd5o
@user-og2ti2wd5o Год назад
дякую велике
@EugeneSuleimanov
@EugeneSuleimanov Год назад
Дякую за відгук
@FeliksBekeshov
@FeliksBekeshov 2 месяца назад
Евгений Здравствуйте , как думаете сейчас смотря на ваш код его же можно было усовершенствовать чтобы мы ужже не зависели от статического метода при добавлении нового класса?
@user-ss2rj4wz5s
@user-ss2rj4wz5s 3 года назад
Паттерн, который только усложняет. Если вы хотите добавить девелопера - пишете класс девелопера, и создаёте через new - Все. А если у вас есть фактори - вам надо добавить нового деведопера, новую фактори, и потом ещё добавить новый if. Ёлки палки - где тут преимущество. Этот паттерн в таком *голом* виде не делает проще. Если вы хотите показать основы - то лучше их показыать не на таких синтетических примерах. После такого только ещё больше вопросов. Если вы думаете, что чем меньше деталей вы говорите, тем проще слушателям - это не так. Детали очень важны и очень интересны
@EugeneSuleimanov
@EugeneSuleimanov 3 года назад
Вероятнее всего вы не смотрели введение и не обратили внимание на цель этого курса. Но, в чем-то вы, возможно, правы.
@dmitrytarashkevich9060
@dmitrytarashkevich9060 8 лет назад
не createDeveloperBySpeciality, а createDeveloperFactoryBySpeciality зачем нам создавать много фабрик, если можно создать одну с параметрами?
@EugeneSuleimanov
@EugeneSuleimanov 8 лет назад
По поводу имени метода - вы правы, тут нужно будет исправить - название метода вводит в заблуждение. А по поводу количества фабрик, важно понимать, что это обучающее видео, а не уровня production. И цель - понимание того, что и как работает.
@dmitrytarashkevich9060
@dmitrytarashkevich9060 8 лет назад
ясно, спасибо
@II-cs3fo
@II-cs3fo 6 лет назад
что и как и так понятно. Ответь на вопрос ЗАЧЕМ?
@hexruin4569
@hexruin4569 4 года назад
Актуальный вопрос спустя 3 года, таки ЗАЧЕМ?
@danilishei
@danilishei 4 года назад
@@hexruin4569 на самом деле в каждой фабрике для наглядности тоже должны быть ветвления. Например тестировщика, разработчика, техлида. Реализовать это вне фабрики будет проблематично, поэтому удобно будет вынести это так как указал автор. С одним лишь методом в фабрике это действительно бессмысленно. В данном случае достаточно интерфейса девелопера
@BaggioVL15
@BaggioVL15 4 года назад
Не вижу никакого преимущества, почему в том if-else блоке просто не возвращать конкретных Developer-ов, а не фабрики?
@JohnWickMovie
@JohnWickMovie 4 года назад
Например создание девелопера может быть не таким простым. А девелопер фактори инкапсулирует конкретную реализацию девелопера
@kolob204
@kolob204 3 года назад
@@JohnWickMovie а каким это не простым ? есть ли примеры ? если весь процесс создания инкапуслирован внутри конструктора класса "девелопер", и фабрика при этом ничего не вызывает кроме как конструктор этого класса. upd: это может быть вызов разных конструкторов, в зависимости от ситуации? И мы как бы скрываем из основного метода MAIN большую часть портянки блоков IF / SWITCH в этих самых фабриках, и таким образом получаем более красивое архитектурно решение?
@JohnWickMovie
@JohnWickMovie 3 года назад
@@kolob204 Здесь просто демонстрируется пример абстракции. В жизни случают сложные ситуации, например тебе нужно отслеживать создание объектов или аллоцировать его в собственном участке памяти, фабрики это позволят легко делать. Да и весь COM от Microsoft построен подобным образом, взгляни на какой нибудь DirectX на досуге, в качестве примера фабрики
@asriyanarseniy8356
@asriyanarseniy8356 3 года назад
Очень круто объясняешь, спасибо. И слава коду, что на ютубе можно поставить скорость воспроизведения 0.75 для заторможенных вроде меня)
@solar9238
@solar9238 13 дней назад
Суть как я понял в том, что если сравнить график функции(количество классов, коэффициент показывающий на сколько код упрощается если использовать фабрику) и функции(количество классов, коэффициент показывающий на сколько код упрощается если НЕ использовать фабрику) То увидим что - количество кода растет в второй функции. Хотя на первый взгляд да, никаким упрощением и не пахнет
@user-ec3nv8rh9l
@user-ec3nv8rh9l 2 года назад
createDeveloperBySpecialty() ...можно было сделать не статичным? Если сделать не интерфейс, а абстрактный класс Фабрику? Или нам нужно будет предусмотреть возможность расширения фабрик?
@vesh95
@vesh95 2 года назад
Вот чаще у меня возникает случай когда те два класса существуют и существует этот интерфейс. И нужно чтобы те классы оставались чистыми, а по интерфейсу можно было взаимодействовать с ними двумя. Тут получается, что нужен класс (или несколько), которые будут реализовать логику тех двух классов через этот интерфейс. Что это за классы будут? Какие паттерны они должны реализовать?
@vesh95
@vesh95 2 года назад
Такое может возникнуть, когда два класса используют два разных источника данных (Модели к разным таблицам, например), но у классов будет одна группа действий. Под один интерфейс их не подвести за счет того, что они должны оставаться чистыми (например, не соответствуют зоне ответственности или это библиотека стороннего разработчика).
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
может быть так нужно: ветвление делать в единственной фабрике и там же создавать разработчиков?
@alexeybelogurov2456
@alexeybelogurov2456 5 лет назад
krosava!
@java8314
@java8314 7 лет назад
Я так понимаю данные шаблон актуально использовать если мы создаем много "продуктов" в программе, т.е. фабрика создает много "продуктов" в программе, на то она и называется фабрика, а не один "продукт" как в вашем примере (у вас типы "продуктов" много, но сам "продукт" один) ? Я понимаю что это учебная прога, но почему то это никто не поясняет. Или я чего то не знаю. А так спасибо за курс, пожалуй это лучшее что я нашел в ютубе по паттернам.
@EugeneSuleimanov
@EugeneSuleimanov 7 лет назад
В любом приложении мы почти всегда создаём много объектов. Причем, к созданию прибавляется некоторая бизнес-логика. Поэтому часто имеет смысл вынести функционал создания объектов в отдельный класс.
@favoriteforyou2438
@favoriteforyou2438 10 месяцев назад
Это не лайфхак для копипаста, почитайте тз. Все круто , спасибо мужик!❤
@EugeneSuleimanov
@EugeneSuleimanov 10 месяцев назад
Спасибо за отзыв!
@user-ti6yk5hv7q
@user-ti6yk5hv7q 7 лет назад
Спасибо за видео. Но я думал ты в конце вытащишь зависимость от конкретной реализации программиста из клиенсткого кода. Можно было сделать хоть в самой фабрике или например в конфиг файл.
@notanord
@notanord 4 года назад
Зачем? Как вы создадите экземпляр класса из ничего? цель фабрик в отделении создании объектов от неизменяемой части кода, а не в отделении клиентского кода от созданий объектов в принципе!
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
все правильно вы говорите, странно что в клиенте сделано придется такую логику теперь писать в каждом клиенте
@lexbekker
@lexbekker Год назад
Автор описал Абстрактную фабрику, подходящую для создания групп элементов, а не фабричный метод. Фабричный метод - это когда у тебя продукты/объекты реализуют один интерфейс, и дальше в клиентском коде ты создаёшь метод с конструкцией switch/case, для определения того, какой конкретный объект тебе нужен, фабрика в этом случае не требуется. Смысл происходяшего был бы понятен, если бы он использовал фабрику для создания ГРУПП ОБЪЕКТОВ ОДНОГО СЕМЕЙСТВА, а не просто одного объекта. К примеру, нужно создавать не одного Developer, а ещё и SeniorDeveloper, TeamLeadDeveloper и прочее. Тогда есть смысл делегировать их создание методам Абстрактной Фабрики, а фабрику определять через свитч-кейс, и эта фабрика могла бы уже производить ОБЪЕКТЫ ОДНОГО СЕМЕЙСТВА, а не тупо один объект. Но в любом случае спасибо, с каждым таким видео узнаю что-то новое!
@lil_fox
@lil_fox Год назад
Как по мне, все же лучше сделать одну фабрику с одним методом,где расположить свитч, и в клиентском классе уже обращаться к нему. Конечно, зависит от ситуации, но так куда читаемее со моему мнению.
@mariklozik
@mariklozik 3 года назад
спасибо , а можно эти if заменить на полиморфизм ?
@user-ei2vj8jv9u
@user-ei2vj8jv9u 3 года назад
Можно, но это будет не самым простым к пониманию решением. Можно создать ассоциативный массив String->Factory, и при инициализации его заполнять всеми возможными билдерами. Доступ к нужному в таком случае произойдёт просто по индексу. Да и заполнение такой коллекции можно сделать через рефлексию или Dependency Injection, но это уже совсем энтерпрайзно. Но это всё уже не к шаблону Factory, а скорее к Strategy.
@Samentg
@Samentg 3 года назад
А можно создать файл с проперти и писать нужного разраба вместо метода ? Или это уже не фабрика?
@user-rw8zs7vz9u
@user-rw8zs7vz9u Год назад
Что это за фишка с диаграммами? В андроид студии есть такая?
@user-sl1ti8bx4h
@user-sl1ti8bx4h 2 года назад
ИМХО. Надо бы литерал и строковую переменную поменять местами, иначе получим NPE " if ("java".equalsIgnoreCase(speciality)) "
@A1xarT
@A1xarT Год назад
Добавим дерево из ифелсов и наш код станет более гибким, отвечаю!
@Light-qo9vo
@Light-qo9vo 2 года назад
Зачем создавать интрефейс на каждого разраба?? Можно ведь просто в DeveloperFactory делать логику через if и возвращать конкретный объект.
@ahmedrapira7610
@ahmedrapira7610 Год назад
Мне кажется здесь была рассмотрена абстрактная фабрика, а не фабричный метод. Не хватает плюсов и минусов, а их много
@lexxkrt
@lexxkrt 3 года назад
короче вместо одного класса придется создавать 5, круто че
@dreamer_vi905
@dreamer_vi905 3 года назад
тут очень простой пример, а в реальности когда много запутанного кода, создание фабрик оправдано.
@TheSporpion
@TheSporpion 3 года назад
Я то же не особо понял плюсов, а что мешает так же создать метод который вернет нужный класс, если мы на каждый класс делаем свою фабрику?
@vsezanyato
@vsezanyato 3 года назад
+++ вообще непонятно вместо пары строк такая лапша
@someperson9237
@someperson9237 3 года назад
@@vsezanyato ну автор, на мой взгяд, взял не самый лучший пример. На самом деле может быть и одна фабрика (например, в конкретном примере). Но в сложных проектах дела обстоят по другому и создание фабрики фабрик оправдано. Например, есть Enum с условным DeveloperTier (Junior, Middle, Senior), и уже исходя из него и будет создаваться Developer. Factory factory = createDeveloperFactory("java"); Developer developer = factory.createDeveloper(DeveloperTier.SENIOR) developer.writeCode();
@lil_fox
@lil_fox Год назад
@@TheSporpion, ничего не мешает, автор создал очень плохую реализацию, с совершенно лишним слоем фабрик, еще и в клиентский класс запихнул функцию создания фабрик, которую придется менять, хотя изначально именно к изменениям в клиентском классе была претензия.
@elvenpath7
@elvenpath7 Год назад
Разве клиенту надо видеть этот статический метод createDeveloperBySpecialty ? В чем тогда смысл фабрики если клиенту все равно придется апдейтить код каждый раз когда добавится новый тип разработчика. Не надо ли его спрятать в базовый класс DeveloperFactory ?
@sf4117
@sf4117 2 года назад
Java developer IS WRITING code... (present continuous)
@user-zt9vo4gh3p
@user-zt9vo4gh3p Год назад
Чтобы это всё понять, нужны знания как минимум Java core
@EugeneSuleimanov
@EugeneSuleimanov Год назад
Безусловно
@BCEMCPATb
@BCEMCPATb 4 года назад
Здравствуйте. Помогите мне разобраться с диаграммой. Никак не могу установить чтобы также как у вас было отображение при нажатии правой клавиши мыши.
@EugeneSuleimanov
@EugeneSuleimanov 4 года назад
Доброе утро, Михаил. Это стандартный плагин, который входит только в ULTIMATE версию IDEA. По-другому получить его, вряд ли, получится.
@mklopotnuk
@mklopotnuk 2 года назад
Я вот чего не могу понять, а почему в данном примере нужна именно фабрика? Почему нельзя просто вот так сделать: public static void main(String[] args) { Developer javaDeveloper = createDeveloperBySpeciality("java"); javaDeveloper.writeCode(); Developer cppDeveloper = createDeveloperBySpeciality("cpp"); cppDeveloper.writeCode(); } static Developer createDeveloperBySpeciality(String speciality){ if(speciality.equalsIgnoreCase("java")){ return new JavaDeveloper(); }else if(speciality.equalsIgnoreCase("cpp")){ return new CppDeveloper(); }else throw new RuntimeException(speciality + " is unknown"); }
@user-kl3mt7rl2n
@user-kl3mt7rl2n 4 года назад
А зачем вообще фабрики, можно же в методе getDeveloperBySpeciality(String tag){ Developer developer; switch(tag): case "java": developer = new AnyDeveloper();} return developer;} Зачем Фабрики??? Объясните пожалуйста, эта тема мне очень интересна. Я начинающий Android Developer.
@EugeneSuleimanov
@EugeneSuleimanov 4 года назад
Потому что объекты могут быть крайне сложными и выносить инициализация в клиентский код не практично
@danyils8728
@danyils8728 6 лет назад
тут и Фабричный Метод из гоф, и Статик Фактори Метод из блоха )
@user-jw9qv9pw3q
@user-jw9qv9pw3q 6 лет назад
а можно строки для фабрики java и тд загнать в enum?
@EugeneSuleimanov
@EugeneSuleimanov 6 лет назад
Добрый день, Михали. Да, конечно, можно.
@Onneaanable
@Onneaanable 5 лет назад
Я так и делаю, по сути в примере это обычный флаг, в таком случае использую enam-ы.
@user-qy7yv1ut4c
@user-qy7yv1ut4c 5 лет назад
диаграммы выводятся с помощью какого-то плагина?
@EugeneSuleimanov
@EugeneSuleimanov 5 лет назад
Добрый вечер, Евгений. Это стандартный плагин в Intellij IDEA Ultimate edition. Т.е. в community такого плагина нет
@user-qy7yv1ut4c
@user-qy7yv1ut4c 5 лет назад
@@EugeneSuleimanov спасибо
@MrGurgen777
@MrGurgen777 Год назад
Я понял что вы сделали, но не понял зачем это нужно…
@romabulava899
@romabulava899 3 года назад
даже я понял
@Serge86210
@Serge86210 2 месяца назад
Видео про фабрику, как реализацию низкосвязного кода, в итоге свести к жесткой зависимости от значения стринга? Читающий обучалку не понимает, о чем читает.
@igorek9191
@igorek9191 Год назад
В конце код стал более громоздким чем в начале... зачем..?
@qwertymangames1800
@qwertymangames1800 Год назад
А зачем нужно так много фабрик если их единственная цель создавать разработчиков? Их же вручную можно создавать таким же образом. Без кучи классов для фабрик. Получается этот шаблон для тех у кого много времени, чтобы плодить лишние сущности.
@MrRomanvideo
@MrRomanvideo 4 года назад
Без статичного метода в клиенте вообще бесполезная штука. Что так, что так надо менять ручками java /cpp.
@lisafox9026
@lisafox9026 4 года назад
зачем столько классов плодить ?
@EugeneSuleimanov
@EugeneSuleimanov 4 года назад
Потому что класс может быть сложным и его инициализация - тоже. И, вместо того, чтобы классе-клиенте писать простыню кода мы просто вызываем метод у класса-фабрики. Ну, и гибкость приложения, чтобы была возможность легко вносить изменения в программу.
@lisafox9026
@lisafox9026 4 года назад
@@EugeneSuleimanov принцип как MVC
@nicholaswhite7351
@nicholaswhite7351 2 месяца назад
Такое нагромождение из if else не есть гуд. Это нарушение принципа open/close.
@EugeneSuleimanov
@EugeneSuleimanov 2 месяца назад
Спасибо за комментарий! Старался делать в точности по материалам GoF, если подскажите, где было отклонение от их примеров - буду признателен.
@nicholaswhite7351
@nicholaswhite7351 2 месяца назад
@@EugeneSuleimanov там все было Ок, на мой взгляд, до появления статического метода получения разработчика по специальности. Этот метод нарушает принцип open/close.
@Novichek55
@Novichek55 9 месяцев назад
без объяснения зачем и в каких случаях нужен этот фабричный метод мне как новичку не понятно зачем надо создавать кучу классов и интерфейсов чтобы в итоге создать один объект и вызвать его метод 🙃
@anq218
@anq218 Год назад
Если никто не понял чего мы пытаемся здесь добиться то максимально рекомендую данное видео ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-rd6wxPzXQvo.html&ab_channel=JPoint%2CJokerиJUGru
@II-cs3fo
@II-cs3fo 6 лет назад
минусую. Потому что как и в других видео ничего не объяснено. Почему я должен воротить такую не**ическую инфраструктуру только чтобы делегировать создание классов? Что такого сказано в видео чего я не могу прочитать в книге или просто увидев название этого шаблона?
@II-cs3fo
@II-cs3fo 6 лет назад
Автор, вот лучше ответил бы на вопрос: почему я не могу возвращать из метода с if'ми сразу экземпляр класса тем более что метод называется createDeveloper а не createFactory? Зачем мне прослойка из структуры фабрик между клиентом и реализациями интерфейса? Вот на такие вопросы надо давать ответы в видео а не просто кратко пересказывать содержимое книги.
@EugeneSuleimanov
@EugeneSuleimanov 6 лет назад
Афобий II просмотр введения в цикл даст ответы на все вопросы
@lil_fox
@lil_fox Год назад
Абсолютно некорректный пример. Вместо паттерна "фабричный метод" показан урезанный паттерн "абстрактная фабрика". В итоге имеется бесполезный слой фабрик, а фабрика является пустой оберткой над конструктором девелопера. И самый сок, началось все претензией к тому, что нужно вносить изменения в клиентский класс, закончилось созданием в клиентском классе целого метода под это дело, в итоге количество мест, куда нужно вносить изменения, только увеличилось. Как нужно было сделать: ДевелоперФабрик сделать классом, в нем реализовать метод криэйтДевелопер, который принимает строку и возвращает объект нудного девелопера. Итого минус изменения в клиентском классе, минус два ненужных класса, соблюдаются принципы единственной ответственности и простоты, пример становится понятным и, что самое главное, применяемым на практике.
@georgepro8481
@georgepro8481 3 года назад
На мой взгляд нет ответа на самый главный вопрос: ЧЕМ фабричный метод ЛУЧШЕ классического конструктора. Ответ прост на примере. Необходимо создать объект класса Студент. При определенных параметрах объект создать не возможно. Например, при возрасте менее 16 лет . Фабрика СМОЖЕТ вернуть NULL. А вот конструктор НЕ СМОЖЕТ. В этом и есть прелесть фабрики.
@kcheban
@kcheban 3 года назад
Более обобщенно - фабрика может скрыть любую логику по созданию объекта - например создание объекта, который требует параметры в конструктор, кеширование, выбор между несколькими реализациями, скачивание данных (даже класса возвращаемого объекта) из интернета
@kergshi9847
@kergshi9847 2 месяца назад
Не понимаю людей ,которые пишут про понятное объяснение. Что тут понятно? Для чего куча всего этого создается? Ничего не понятно. А статичный метод? Серьезно? А если на разработчиков всех языков программирования выводить,то какое же это полотно получится. Что за бред? И сколько будет доп класс с переопределенными методами,в которых будет выводиться строка под каждого. Это же с ума сойти можно. Я не разработчик,может сейчас фигню сморожу. Но не проще было бы сделать,что бы этот статичный метод принимал не строку с названием специальности а ОБЪЕКТ? Интерфейс ,блин. И в main вместо строки лямбду передавать. И не придется каждый раз при добавлении нового создавать доп классы, лепить доп условия.
@KindHeart-oq7mj
@KindHeart-oq7mj Год назад
Спасибо, но понятнее не стало
@user-qx3jt8fw1v
@user-qx3jt8fw1v 2 года назад
Как насчет такого, более интерактивного варианта? public class Program { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Введите язык программирования для создания нового программиста:"); System.out.println("1. \"java\" 2. \"c++\" 3. \"php\" "); String specialtyFromUser = sc.nextLine(); DeveloperFactory developerFactory = createDeveloperBySpecialty(specialtyFromUser); Developer developer = developerFactory.createDeveloper(); developer.writeCode(); } static DeveloperFactory createDeveloperBySpecialty(String specialty) { return switch (specialty.toLowerCase()) { case "java" -> new JavaDeveloperFactory(); case "c++" -> new CppDeveloperFactory(); case "php" -> new PhpDeveloperFactory(); default -> throw new RuntimeException(specialty + " specialty is unknown."); }; } }
@user-ot5iy5es4l
@user-ot5iy5es4l 2 года назад
Бедная клавиатура...
@EugeneSuleimanov
@EugeneSuleimanov 2 года назад
Она до сих пор приходит ко мне во снах :)
@soul33d
@soul33d 7 лет назад
как-то не очень сплошные ифы смотрятся, лучше уже switch
@notanord
@notanord 4 года назад
Не лучше, switch жёстче, чем if else, т.к. зависит от конкретного сравниваемой переменной и ее типа
@jacobmmm8260
@jacobmmm8260 3 года назад
В switch ignorecase не получится
@bestroff8814
@bestroff8814 9 месяцев назад
Бедная клавиатура
@EugeneSuleimanov
@EugeneSuleimanov 9 месяцев назад
Она не выдержала :)
@user-yt8ow8hh9i
@user-yt8ow8hh9i 4 года назад
Вместо паутины if else лучше мапу
@user-xs6hd9xf7y
@user-xs6hd9xf7y 7 лет назад
Зачем так сложно ? Зачем столько фабрик ? Почему ответственность за создание нужного класса не инкапсулируется в фабрике, а реализована в статическом методе пользователем ? Разве это не нарушает основную идею паттерна ? Почему нельзя фабричный метод сделать с параметром ?
@EugeneSuleimanov
@EugeneSuleimanov 7 лет назад
Это реализация шаблона по GoF. Если вы не согласны с их подходом к проектированию... Без комментариев.
@user-ti6yk5hv7q
@user-ti6yk5hv7q 7 лет назад
Даже если ты не прав, с таким ответом, свою неправоту уже не признаешь. Не ссылок, ни примеров. Разве в книге нет примера фабричного метода с параметром?
@EugeneSuleimanov
@EugeneSuleimanov 7 лет назад
Странный комментарий. Раз 10 перечитал - так и не понял о чём он. Понял только вопрос. Отвечаю: В книге есть пример, но несколько более сложный и его трудно использовать без контекста всей книги.
@user-xs6hd9xf7y
@user-xs6hd9xf7y 7 лет назад
Я ничего утверждаю, но возможно своим упрощением вы разрушали основную идею паттерна. :))
@EugeneSuleimanov
@EugeneSuleimanov 7 лет назад
Какое упрощение? Паттерн сделан стандартно - а клиентский класс всего лишь демонстрирует его работу.
@SansHAP
@SansHAP 7 лет назад
больше похоже на полиморфизм
@dmitry4137
@dmitry4137 3 года назад
Зачем лепить фабрику в примере про фабричный метод
@Ahelhot
@Ahelhot 4 года назад
java головного мозга) 25 ненужных классов, которые не решают никак проблему создания объектов, просто оборачивают это в 3 слоя. Ещё и solid сломан. Понятно почему у вас в java нормальными считаются стектрейсы в 2000 вложений.
@feofankovalsky1651
@feofankovalsky1651 2 года назад
конечно шляпа, а не урок
Далее
Шаблоны Java. Proxy (Прокси)
7:01
Просмотров 26 тыс.
🤢 To try piggy toothpick beauty gadget
00:30
Просмотров 9 млн
мы встретились 🔥
00:16
Просмотров 28 тыс.
Абстрактная Фабрика
12:06
Просмотров 35 тыс.
Фабричный метод
15:48
Просмотров 59 тыс.
Шаблоны Java. Iterator (Итератор).
6:19