Различия между шаблоном построителя и методом шаблона (построитель и шаблон)

Шаблон шаблона предоставляет алгоритм в базовом классе, шаги которого могут быть изменены в производном классе. В шаблоне Builder конкретный строитель предоставляет методы для создания продукта, которые вызываются из класса Director.

Я понимаю, что есть разница в целях использования этих шаблонов. Шаблон шаблона - это шаблон поведения, который изменяет один или несколько шагов в шаблоне, тогда как шаблон построителя - это шаблон создания.

Есть ли еще какие-то отличия, помимо указанной выше разницы?

Разве директор в шаблоне построителя не действует как базовый шаблон в шаблоне шаблона. Конкретные строители действуют как производные классы в шаблоне шаблона с заменяемыми шагами?

Может кто-нибудь уточнить. Спасибо.

Я имею в виду http://www.dofactory.com/Patterns/Patterns.aspx


person Sandeep G B    schedule 15.04.2011    source источник


Ответы (3)


Шаблонный метод - это просто способ определить некоторые методы, которые должен определять каждый подкласс.

Шаблон строителя используется для создания более сложного объекта.

Допустим, мы хотим построить разные модели Saab (марки автомобилей). У каждой модели разные двигатели, фары и т. Д.

Если бы нам пришлось использовать шаблон метода шаблона, нам пришлось бы создать один класс для каждой отдельной комбинации автомобилей или использовать некоторые неприятные иерархии наследования. Многие из этих методов также будут содержать повторяющийся код.

Вместо этого с помощью шаблона сборки мы можем брать разные части и составлять из них целую машину. Следовательно, при необходимости мы можем повторно использовать двигатель для каждой модели, а также настроить каждую часть автомобиля.

person jgauffin    schedule 15.04.2011
comment
Спасибо, jgauffin. Один вопрос касался того, как работает директор в строителе. Разве у директора нет шагов по созданию объекта в определенном порядке. Что делать, если застройщик хочет изменить заказ? Я имею в виду приведенный здесь пример dofactory.com/Patterns/PatternBuilder.aspx#_self1 < / а> - person Sandeep G B; 15.04.2011
comment
Что ж. Тогда вы нарушаете принцип подстановки Лискова и должны переделать свой код;) - person jgauffin; 15.04.2011

Я нашел тот же вопрос очень интересным.

Пример автомобиля Saab интересен, но он не соответствует описанию шаблона Builder в "Gang of Four" (Шаблоны проектирования).

Я буду использовать терминологию «Банды четырех».

В Gang of Four не может быть смеси конкретных строителей для каждого вызова aDirector->Construct(), поэтому пример Saab, хотя и интересен, не отвечает на этот вопрос на самом деле для меня.

Я вижу некоторых:

Ключевым отличием является отделение объекта-директора от иерархии построителя. В фабрике шаблонов и метод, реализующий обобщенный поток, и методы переопределения являются членами одного класса. Это позволяет паттерну Builder лучше инкапсулировать внутренние этапы процесса, поскольку клиентский код с меньшей вероятностью вступит в контакт с такими методами при доступе только к объекту Director. Шаблон Builder также позволяет формулировать процесс сборки полностью независимо от иерархии Builder, позволяя при необходимости более гибкую замену экземпляра Builder. Например, имея под рукой экземпляр директора, вы можете легко построить несколько представлений продукта, каждый раз динамически заменяя конкретный конструктор. Таким образом, строитель более динамичен и лучше отражает внутреннюю работу бетонного строителя.

Кроме того, если вы хотите уточнить объект Director путем наследования, вы можете сделать это, не увеличивая свою иерархию. Например, у вас может быть экспресс-процесс построения для экономии времени перед окончательным построением - вы можете создать подкласс объекта Director или даже использовать для него «метод шаблона» сам по себе, чтобы настроить его наследованием, не требуя повторной реализации ваших конкретных построителей.

Но это заставляет нас рассмотреть другой паттерн, который тесно связан с «Фабрикой шаблонов» - паттерн «Стратегия».

Стратегия очень похожа на фабрику шаблонов с двумя явными отличиями: она также отделяет объект контекста от иерархии стратегии, позволяя переключать алгоритмы для одного экземпляра проблемы во время выполнения. Другое отличие состоит в том, что примеры, кажется, предполагают, что вызов Стратегии не обязательно включает сложный или структурированный процесс, как в «Методе шаблона».

Но я привожу его здесь как аналог Builder, чтобы перейти к другому пункту - если «Стратегия» параллельна по своей структуре классов Builder, то параллельным шаблоном создания «Шаблонному методу» должен быть «Заводской метод». Это понятно не только по названию, но и, что достаточно интересно, в обсуждениях обеих глав книги «Заводской метод» и «Шаблонный метод» используются практически идентичные примеры (приложение для редактирования документов).

Итак, не вдаваясь в вопрос о том, в чем разница между творческими и поведенческими паттернами, я склонен думать, что и Builder, и Factory Method являются в основном конкретными случаями и уточнениями стратегии и Template Method соответственно.

Таким образом, возникает вопрос - если вы не видите разницы между Builder и Template Factory - попробуйте ответить на эти вопросы:

  1. Какую точку зрения вы предпочитаете иметь в отношении этой конкретной части системы? Это «поведение» или «творчество»? и

  2. Требуется ли вам сильная инкапсуляция, или динамическая замена, или развертывание, или настройка экземпляра построителя, с одной стороны, или вы ожидаете, что сложность (за счет наследования, композиции или иным образом) будет развиваться вокруг процесса создания или метода шаблона? Если ответ на любой из этих вопросов, обратитесь к структуре Строителя / Стратегии. В противном случае используйте простой полиморфизм отношения или поведения в паттернах метода XX.

person Ron    schedule 02.07.2012

Прежде чем я начну, моя универсальная линия для всех моих ответов: «Любую концепцию программирования на любом языке необходимо понимать тремя способами. (A) С точки зрения дизайна (b) С точки зрения времени выполнения (c) С точки зрения памяти.

Сказав, что люди, дающие ответ на основе (а), могут не соглашаться с (б) и наоборот (или может быть кто-то даст круговое объяснение, чтобы испортить четкое определение). Конструктор пиццы, Строитель ресторана, Строитель автомобилей или шаблон пользовательского интерфейса, шаблон рабочего процесса не имеют никакого смысла, когда в корпоративном проекте вас просят реализовать шаблон Строитель / Шаблон (может быть, эти шаблоны еще недостаточно развиты, чтобы определить себя). Причина сбоя в том, что если я знаю, что какой-то объект должен быть построен за 4 шага, то почему я начну создавать его экземпляр с пустого места и заполнять его шаг за шагом, используя Director. Что произойдет, если я не хочу, чтобы шаг 3 или на шаге 2 произошло слишком много исключений. Вместо этого я создам конечный объект, когда будут выполнены все 4 шага (именно это и произошло со мной на протяжении всей моей карьеры, и поэтому шаблон строителя таков. не принят разработчиками). Здесь ppl может возразить в распределенных системах, где требуется асинхронное поведение, тогда Builder может помочь; но если это так, то я все равно буду полагаться на onreadystatechange == 4, а затем создать экземпляр своего builderObj. Значит, мы не должны использовать Builder? ИМХО ответ - «НЕТ».

Насколько я понимаю, в .net у нас есть ControllerBuilder, SqlConnectionStringBuilder, UriBuilder; все настраивают ControllerFactory, Sql, Uri Factories; тогда моя основная программа может использовать эти фабрики для генерации контроллеров, ConnStrings, Uries. Итак, шаблон Builder предназначен для настройки на заводе? нам нужна заводская настройка? Наверное, никогда; вместо этого лучшее, что я сделаю, - это создать 4 асинхронных метода и связать их с параметрами шага 2 (на втором этапе цепочки параметров шага 3 ...). Какой шаблон abt (шаблон рабочего процесса asp.net, шаблон jQuery или готовый шаблон). Для меня оба одинаковы, но по сравнению с конструктором, шаблон более жесткий по своей природе (почти все исправлено, очень мало свойств изменяется для определения конкретного tmplt), и как только шаблон определен, затем завод. Еще один слух, который я видел для этих двоих, способен на «Любая фабрика-> Любой продукт» как Когда вы будете использовать шаблон Builder?; но это не так, потому что это похоже на приведенный выше сценарий .net ControllerBuilder, sql, uri с концепцией «Factory of Factory». Это противоречит многим принципам проектирования (SRP, LSP, плохая инкапсуляция). Надеюсь, что мой полный текст об этих двух поможет от новичка до продвинутого.

person Saurabh    schedule 08.09.2017