Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2

Назначение шаблона Билдер

24.09.2021, 10:56. Показов 6164. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, смотрел на pluralsight курс по паттернам, ну и там затронули Билдер. Но как я позже начал понимать, у него есть еще дополнительная реализация, "FluentBuilder". Который вроде бы как и похож на тот же StringBuilder по манере поведения.
Итого из того что я видел, есть 2 билдера:
1. Обычный, который чаще всего везде упоминается. Если углублятся в вышеизложенный пример, то классы MotorCycleBuilder, CarBuilder, ScooterBuilder лишь инапсулируют инициализацию свойств, посредством вызова Construct в классе Shop.
Честно говоря не знаю, насколько такой пример реально полезен в жизни.
2. Fluent builder, как по мне, более реалистичный пример/. То есть мы именно поэтапно строим объект, с валидацией и некоторой логикой.
Часто ли вы пользуетесь билдером в реальной жизни?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2021, 10:56
Ответы с готовыми решениями:

Автоматическое назначение шаблона
Как отключить автоматическое назначение шаблонов...? Ибо сайт состоит из трёх шаблонов и не могу отдельно каждому назначить нужный... ...

32.Модуль в Паскале (Unit), его назначение, структура модуля, назначение и описание частей модуля
32.Модуль в Паскале (Unit), его назначение, структура модуля, назначение и описание частей модуля.

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

23
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
27.09.2021, 18:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Shamil1 Посмотреть сообщение
Но код создания всё равно не в билдере.
Ну само собой, нам же нужно чем-то инициализировать объект, не хардкодить же все параметры в каком-нибудь Директоре.

Цитата Сообщение от Shamil1 Посмотреть сообщение
В приведённом примере (который без абстрактного билдера) перенос логики создания в билдер не даёт такой возможности. Пользователь класса вообще не заметит никакой разницы. Зачем переносить метод создания в другой класс?
Я не понимаю, в чём вопрос, ты же сам написал:
Цитата Сообщение от Shamil1 Посмотреть сообщение
Строитель даёт возможность использовать один и тот же код строительства для получения разных представлений объектов.
Цитата Сообщение от Shamil1 Посмотреть сообщение
То есть, забыть передать обязательное поле - для Вас проблема
Да.

Цитата Сообщение от Shamil1 Посмотреть сообщение
а забыть передать необязательное поле - для Вас не проблема?
Это другая проблема.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Только для обязательных полей это вскроется при первом же запуске
Но зачем запускать, если можно отловить ещё на этапе компиляции и даже написания кода?

Цитата Сообщение от Shamil1 Посмотреть сообщение
То есть, если я в какой-то класс добавлю метод для явного приведения к другому типу, то я использую паттерн Строитель?
Нет, откуда такой вывод?
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
27.09.2021, 20:05  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
IDEA достаточно умна для этого, она считает методы set<field name> и get<field name> сеттером и геттером для <field name> и предлагает их переименовать вместе с полем. Для этого много ума-то и не надо, в общем-то.
помню однажды был на проекте и долго искал геттеры и сеттеры, а оказалось что там их lombok сам генерирует
Еще интересная статья, 4 ways to implement builder design pattern
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
27.09.2021, 21:22
Цитата Сообщение от korvin_ Посмотреть сообщение
Я не понимаю, в чём вопрос, ты же сам написал:
Потому что в Примере 2 нет возможности использовать один и тот же код для получения разных представлений объекта. Чтобы построить другое представление, придется поменять код создания объекта. Нельзя просто передать этому коду другой билдер. А Строитель даёт возможность использовать один и тот же код строительства для получения разных представлений объектов (с чем Вы согласились).

Цитата Сообщение от korvin_ Посмотреть сообщение
Но зачем запускать, если можно отловить ещё на этапе компиляции и даже написания кода?
Выигрыша ноль. Все равно Вам придется убедиться, что Вы не забыли передать необязательные аргументы. Когда Вы в этом убедитесь, у Вас будет стопроцентная уверенность, что Вы не забыли про обязательные.

Цитата Сообщение от korvin_ Посмотреть сообщение
Нет, откуда такой вывод?
Мне показалось, что у Вас создание объекта другого класса является достаточным условием, чтобы объявить, что это паттерн Строитель.

Каковы достаточные условия, чтобы сказать, что используется паттерн Строитель?


StringBuilder - это Строитель?
C#
1
2
3
4
5
6
7
StringBuilder sb = new StringBuilder();
 
// construct, using builder
sb.Append("aaa");         
 
// get result
string s = sb.ToString();
TagBuilder - это Строитель?
C#
1
2
3
4
5
6
7
8
9
var builder = new TagBuilder("img");
 
// construct, using builder
builder.GenerateId("aaa");
builder.MergeAttribute("src", "http://bbb.com");
builder.MergeAttribute("alt", "ccc");
 
// get result
string img = builder.ToString(TagRenderMode.SelfClosing);

UserOptions - это Строитель?
C#
1
2
3
4
5
6
7
var options = new UserOptions();
 
// construct, using builder
options.SetAge(10);
 
// get result
var user = options.Build();
Пример, на который Вы давали ссылку - это Строитель? (я переписал его на C# для удобства)
C#
1
2
3
4
5
6
7
8
var cb = new CakeBuilder();
 
// construct, using builder
cb.Sugar(1);
cb.Butter(0.5);
 
// get result
var cake = cb.Build();
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
28.09.2021, 10:17
В третьем примере забыл присвоить возвращаемое значение:
var user = options.Build();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.09.2021, 10:17

Для использование шаблона переменной требуется список аргументов шаблона
Здравствуйте! Не могу понять в чём проблема. //ALL2.cpp #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;Windows.h&gt; ...

Ссылка на объект шаблона как поле шаблона класса)
Здравствуйте, подскажите, пожалуйста. Есть шаблон классаtemplate &lt; int ArrayLength &gt; class Vertex{ public: float x; float y;...

Gtest, доступ к элементам базового класса-шаблона без указания параметров шаблона. баг или фича?
Всем привет. Продолжаю экспертизу gtest/gmock. Количество ошибок и багов зашкаливает. Ничего удивительного, учитывая то, ...

Определение метода-шаблона за пределами шаблона класса
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt; class K // шаблон класса { ...

Редактирование шаблона сайта и шаблона письма
Помогите найти , где и как ? Т.е. уже 3 дня роюсь и не в состоянии найти где убить пару кнопок и поменять логотип и где редактировать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru