Для тех кто не понял, вот вам основное различие: Фабричный метод используется для создания только одного продукта Абстрактная фабрика - это создание семейств связанных или зависимых продуктов.
я не знаю как, кому, а мне данный формат видео лучше заходит. Это на основе древнего и первобытного, делай как я. Темп отличный. Лишнего нет. Да и всяких слов паразитов минимум.
Самое толковое и дельное объяснение абстрактных фабрик... Без воды и бессмысленного прыгания у доски и калякания всяких идиотских картинок. Почти парное программирование. Огромный респект
Спасибо! Годное видео! На обычной фабрике пример был не очень, и мне пришлось посмотреть другой ролик по этой теме)), но про абстрактную фабрику - определённо топ)
все круто и понятно, но было бы круто если вы бы на примере показали почему нужно использовать данный паттерн и что может случится если его не использовать
Спасибо за урок! Жаль, что не показали UML диаграмму, обычно ее переношу в конспект и по ней потом ориентируюсь! У меня IDEA CE, в ней не посмотреть такое.
Дуже круті відео, дякую. :) Moжна також Project заімплементувати як Фабричний метод, цим самим інкапсулювати код від клієнта: public abstract class Project { protected String type; protected Developer developer; protected Tester tester; protected ProjectManager manager;
public void startProject() { setUpTeam(); // Фабричний метод з субкласу System.out.println(String.format("Creating %s project. . .", type)); developer.writeCode(); tester.testCode(); manager.manageProject(); System.out.println(" "); } protected abstract void setUpTeam(); // Фабричний метод буде в субкласі } public class JavaProject extends Project { @Override protected void setUpTeam() { type = "Java"; AbstractFactory factory = new JavaProjectFactory(); developer = factory.createDeveloper(); tester = factory.createTester(); manager = factory.createProjectManager(); } } public class Company { public static void main(String[] args) { Project webProject = new WebProject(); webProject.startProject();
Project bankProject = new JavaProject(); bankProject.startProject(); } }
в простой фабрике мы создаём все свои классы в одном методе. Фабричный метод говорит "пацаны, а давайте мы как нормальные люди вынесем эти кусочки кода отдельно, чтобы это дело можно было легко найти и проще читать", поэтому мы взываем на к фабрике, которая знает про всё, а к фабрике, которая знает, как создать конкретно нужный вам обьект. Абстрактная фабрика - совсем другая птица
Либо я что-то не так понял, либо здесь и в предыдущем видео не показана полная суть и смысл данных шаблонов и нарушен принцип сухого кода. Имхо у нас должен быть некий объект команды (с её типом и полями разраб тестер пм), а наша фабрика как раз генерирует команды и подсовывает в эти поля правильные сущности, завязанные на тип проекта. И в конце должен быть общий мэйн, где мы получаем две команды под проект каждого типа, а потом вызываем статик метод команд "делать проект"... В этом и есть смысл абстрактных фабрик - абстракция и сокрытие генерации правильных типов объектов, что бы в мэйне осталась только бизнесс-логика.
А если в другом проекте мне нужен новый разработчик (например, сисадмин), а в старых фабриках ничего не менять, какой паттерн тогда применять? Или можно как-то модифицировать этот паттерн?
Евгений, спасибо за полезное видео. Скажите, что имелось в виду под "добавлять любого разработчика в любую команду"(фраза в конце). - если вместо простого возвращения новых сущностей в переопределениях get-методов класса WebsiteTeamFactory(к примеру) написать логику выбора или же как в прмиере с "Фабрикой" добавить статичный метод который будет принимать строку и возвращать тип фабрики? Cпасибо.
@@EugeneSuleimanov всегда, пожалуйста. Не смотря на то, что программирую не первый год, паттерны как-то обходил стороной. Вот как-то пришлось заняться на днях. Можно и самому осилить, но с такими то примерами обучение становится комфортным и хочется это озвучить..) А причина проста. Такие каналы должны быть в ТОПе.
Так называется паттерн. Мы создали интерфейс фабрики, но т.к. интерфейс на самом деле - это полностью абстрактный класс, у которого все методы абстрактные (если мы говорим о Java), то можно сказать, что у нас есть какая то "абстрактная фабрика объектов", и реализаций этой "абстрактной фабрики" может быть сколько угодно.
@@sergeyinyakin9730 в том что тут мы выбираем фабрику под проект. А там мы выбирали фабрику под язык программирования. Как мне кажется разница в уровнях абстракции.
не понимаю я предназначение этих Шаблонов, ну создал бы я этих разработчиков и тестировщиков в методе mai() без Фабрики напрямую, что от этого бы изменилось??? Зачем нужна Фабрика ???🙃
Смысл в том, у тебя получается гибкий код, поведение которого ты можешь настраивать при запуске, без переделки самого кода. Например, вместо отдельных классов со своими мейнами, можно было бы в основном мейне сделать switch, который бы принимал строку из args из параметров мейна и по ней бы вызывал нужную фабрику, которая бы уже собирала тебе нужную команду. Т.е. тебе для изменения поведения приложения достаточно запустить его с нужным параметром. При этом такую абстрактную фабрику легко расширять или изменять, добавляя новые команды, например. Если бы ты всех нужных сотрудников команды создавал бы через new() в мейне, то тебе бы было тяжело настраивать повделение приложения и еще сложнее его как-то изменять в дальнейшем. На практике такое может применяться, например, при описании разных конфигураций подключения к БД. Если все сделано правильно, например, по такому шаблону, то тип и параметры подключения у тебя могут задаваться в файле конфигурации, куда инсертятся через переменные окружения. И чтобы переключиться с одной БД на другую, тебе достаточно изменить значения в переменных окружения и перезапустить приложение. А в твоем случае тебе пришлось бы лезть в код и менять нужные объекты на новые во всех нужных местах, потом коммитить и деплоить изменения. И это не круто :)
Мдя я абстрагировался когда это все увидел, куча когда чтоб просто получить айди юзера, кажется все еще более запутанным чем простые ссылки к классам, абстрагируешься на каждом шаге то интерфейс то промежуточный класс чтоб только передать пас другому, еще больший клубок для распутывания, чем раньше... а так все хорошо объясняется...
Да, конечно, это возможно, но местами при работе с большими системами это неудобно. Особенно, если не используются фреймворки, где эти шаблоны реализованы и используются "под капотом".
чувствуется уровень. 90% остальных видео реально рядом не валялись - все четко, по делу, не отвлекаясь на простые вещи. Респект
Это сарказм?
ты идиот?
@@Тралфейс
@@Тралфейс Да нет. Он неплохо показывает основой принцип
Для тех кто не понял, вот вам основное различие:
Фабричный метод используется для создания только одного продукта
Абстрактная фабрика - это создание семейств связанных или зависимых продуктов.
Спасибо, я как раз это упустил)
Легенда
я не знаю как, кому, а мне данный формат видео лучше заходит. Это на основе древнего и первобытного, делай как я. Темп отличный. Лишнего нет. Да и всяких слов паразитов минимум.
Спасибо за отзыв!
Очень понятно когда он показывает разницу паттернов. Уважуха братан✊
Самое толковое и дельное объяснение абстрактных фабрик... Без воды и бессмысленного прыгания у доски и калякания всяких идиотских картинок. Почти парное программирование. Огромный респект
Столько всего прочел пересмотрел и никак не понимал до просмотра этого видео. Спасибо !
Спасибо за качественный урок) Отличный материал для начинающих и не только, лучше начинаешь понимать необходимость применения интерфейсов.
Спасибо :)
отличный урок. четко и понятно показан шаблон и как работает. спасибо!
Хорошо когда без ошибок всю информацию сразу в правильном порядке преподносят, сразу все в памяти откладывается.
Спасибо! Годное видео! На обычной фабрике пример был не очень, и мне пришлось посмотреть другой ролик по этой теме)), но про абстрактную фабрику - определённо топ)
@@IbnSabilAbuAbdullah спасибо за отзыв!
Супер, тоже респект!!! Все четко и понятно.
Браво, Женя! Крутое видео. Спасибо!
Спасибо за поддержку!
Очень нравится как звучит клава, обычно звук ацтой, а тут я бывает заслушиваюсь больше над звуком клавы
Утька моя
смотрю 4 видео. Объяснения четкие и внятные, без всяких "эээ.. ммм" и т. д.
Уровень подачи и понимания шаблонов 10 из 10. Объяснить проще уже не получится ни у кого))
все круто и понятно, но было бы круто если вы бы на примере показали почему нужно использовать данный паттерн и что может случится если его не использовать
Спасибо за урок!
Жаль, что не показали UML диаграмму, обычно ее переношу в конспект и по ней потом ориентируюсь! У меня IDEA CE, в ней не посмотреть такое.
Большое спасибо, очень доступно
Спасибо за отзыв!
Дуже круті відео, дякую. :) Moжна також Project заімплементувати як Фабричний метод, цим самим інкапсулювати код від клієнта:
public abstract class Project {
protected String type;
protected Developer developer;
protected Tester tester;
protected ProjectManager manager;
public void startProject() {
setUpTeam(); // Фабричний метод з субкласу
System.out.println(String.format("Creating %s project. . .", type));
developer.writeCode();
tester.testCode();
manager.manageProject();
System.out.println("
");
}
protected abstract void setUpTeam(); // Фабричний метод буде в субкласі
}
public class JavaProject extends Project {
@Override
protected void setUpTeam() {
type = "Java";
AbstractFactory factory = new JavaProjectFactory();
developer = factory.createDeveloper();
tester = factory.createTester();
manager = factory.createProjectManager();
}
}
public class Company {
public static void main(String[] args) {
Project webProject = new WebProject();
webProject.startProject();
Project bankProject = new JavaProject();
bankProject.startProject();
}
}
Дякую за відгук!
Не подскажите, в чем разница этих двух фабрик от паттерна Простой Фабрики? В целях и практическом применении. Спасибо!
Абстрактная фабрика, грубо говоря - попытка создать группу фабрик.
в простой фабрике мы создаём все свои классы в одном методе. Фабричный метод говорит "пацаны, а давайте мы как нормальные люди вынесем эти кусочки кода отдельно, чтобы это дело можно было легко найти и проще читать", поэтому мы взываем на к фабрике, которая знает про всё, а к фабрике, которая знает, как создать конкретно нужный вам обьект. Абстрактная фабрика - совсем другая птица
Либо я что-то не так понял, либо здесь и в предыдущем видео не показана полная суть и смысл данных шаблонов и нарушен принцип сухого кода. Имхо у нас должен быть некий объект команды (с её типом и полями разраб тестер пм), а наша фабрика как раз генерирует команды и подсовывает в эти поля правильные сущности, завязанные на тип проекта. И в конце должен быть общий мэйн, где мы получаем две команды под проект каждого типа, а потом вызываем статик метод команд "делать проект"... В этом и есть смысл абстрактных фабрик - абстракция и сокрытие генерации правильных типов объектов, что бы в мэйне осталась только бизнесс-логика.
А если в другом проекте мне нужен новый разработчик (например, сисадмин), а в старых фабриках ничего не менять, какой паттерн тогда применять? Или можно как-то модифицировать этот паттерн?
Евгений, спасибо за полезное видео. Скажите, что имелось в виду под "добавлять любого разработчика в любую команду"(фраза в конце). - если вместо простого возвращения новых сущностей в переопределениях get-методов класса WebsiteTeamFactory(к примеру) написать логику выбора или же как в прмиере с "Фабрикой" добавить статичный метод который будет принимать строку и возвращать тип фабрики? Cпасибо.
Прекрасная подача информации. Платные курсы и рядом не стояли..
Спасибо за отзыв, Виктор
@@EugeneSuleimanov всегда, пожалуйста. Не смотря на то, что программирую не первый год, паттерны как-то обходил стороной. Вот как-то пришлось заняться на днях. Можно и самому осилить, но с такими то примерами обучение становится комфортным и хочется это озвучить..) А причина проста. Такие каналы должны быть в ТОПе.
@@ВикторДемихов-ц9о +++
отлично!
Так эта фабрика выдает набор обэктов - сгруппировали создание комманды в один класс и редактировать команду можно из одного места - ? В этом суть?
Спасибо!
Пожалуйста, Сергей.
Почему в классе BankingTeamFactory когда оверайдим метод getDeveloper пишем просто
return new JavaDeveloper и не приводим к типу (Developer)?
Потому что JavaDeveloper уже реализован по интерфесу Developer
Гуглить: upcast
А что если в команде нет тестера? Возвращать эксепшен? Вроде как плохая практика.
Тестирование и эксепшн - несколько разные вещи. Исключение - это просто способ обработки ситуаций. А QA - это оценка качества продукта.
красивый и чоткий код
Почему называется абстрактная фабрика, когда это интерфейс
?
Так называется паттерн. Мы создали интерфейс фабрики, но т.к. интерфейс на самом деле - это полностью абстрактный класс, у которого все методы абстрактные (если мы говорим о Java), то можно сказать, что у нас есть какая то "абстрактная фабрика объектов", и реализаций этой "абстрактной фабрики" может быть сколько угодно.
@@sergeyinyakin9730 в том что тут мы выбираем фабрику под проект. А там мы выбирали фабрику под язык программирования. Как мне кажется разница в уровнях абстракции.
@@sergeyinyakin9730 дело не в абстракции как части языка, а в абстракции, как понятия. Ключевое слово abstract здесь совершенно не причем.
@@sergeyinyakin9730 значит, растёшь) когда поймешь, что уже не растёшь - пора менять профессию.
все таки не понятно чуть-чуть ... надо пристально следить за мыслью
Спасибо! А UML диаграмму забыли(
Да, действительно ) Увидел только посое вашего комментария. Спасибо, что обратили внимание
на php можно написать сайт, на java можно написать фабрику php разработчиков...
И фабрику фабрик разработчиков…
не понимаю я предназначение этих Шаблонов, ну создал бы я этих разработчиков и тестировщиков в методе mai() без Фабрики напрямую, что от этого бы изменилось??? Зачем нужна Фабрика ???🙃
Смысл в том, у тебя получается гибкий код, поведение которого ты можешь настраивать при запуске, без переделки самого кода. Например, вместо отдельных классов со своими мейнами, можно было бы в основном мейне сделать switch, который бы принимал строку из args из параметров мейна и по ней бы вызывал нужную фабрику, которая бы уже собирала тебе нужную команду. Т.е. тебе для изменения поведения приложения достаточно запустить его с нужным параметром. При этом такую абстрактную фабрику легко расширять или изменять, добавляя новые команды, например. Если бы ты всех нужных сотрудников команды создавал бы через new() в мейне, то тебе бы было тяжело настраивать повделение приложения и еще сложнее его как-то изменять в дальнейшем.
На практике такое может применяться, например, при описании разных конфигураций подключения к БД. Если все сделано правильно, например, по такому шаблону, то тип и параметры подключения у тебя могут задаваться в файле конфигурации, куда инсертятся через переменные окружения. И чтобы переключиться с одной БД на другую, тебе достаточно изменить значения в переменных окружения и перезапустить приложение. А в твоем случае тебе пришлось бы лезть в код и менять нужные объекты на новые во всех нужных местах, потом коммитить и деплоить изменения. И это не круто :)
Все хорошо. Только опечатка (аСБтрактная фабрика).
Спасибо за сигнал.
Исправил.
Да это тебе спасибо. Две книги прочитал и не вдуплял (и википедию тоже). А сейчас хоть какая-то ясность настает.
Мдя я абстрагировался когда это все увидел, куча когда чтоб просто получить айди юзера, кажется все еще более запутанным чем простые ссылки к классам, абстрагируешься на каждом шаге то интерфейс то промежуточный класс чтоб только передать пас другому, еще больший клубок для распутывания, чем раньше... а так все хорошо объясняется...
В сложных проектах это поможет
Не очень понятна практическая применимость все равно
нифига ты быстро печатаешь...Пианист что ли?
Зачем это учить ? Ведь можно и без них нормально разрабатывать приложения...
Да, конечно, это возможно, но местами при работе с большими системами это неудобно. Особенно, если не используются фреймворки, где эти шаблоны реализованы и используются "под капотом".
удар по клавишам будто показывает какую-то неприязнь, непорядок с нервами
Это я самоутверждаюсь и пытаюсь доминировать, хотя бы над клавиатурой. Это наполняет меня ощущением власти :)
@@EugeneSuleimanov Творчество не иссякаемое : хочу творю, а хочу - вытворяю! ))
Спасибо!