Различия между шаблоном компоновщика и методом шаблона (компоновщик и шаблон) - PullRequest
11 голосов
/ 15 апреля 2011

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

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

Есть ли другие различия, кроме вышеуказанного различия?

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

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

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

Ответы [ 3 ]

8 голосов
/ 15 апреля 2011

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

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

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

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

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

6 голосов
/ 02 июля 2012

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

Пример автомобиля Saab интересен, но он не соответствует описанию шаблона Builder в «Банде четырех» (Design Patterns).

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

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

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

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

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

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

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

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

Итак, не вдаваясь в вопрос о том, в чем разница между творческим и поведенческим паттернами, я склонен думать, что и Строитель, и Фабричный метод - это в основном конкретные случаи и уточнения Стратегии и Шаблонного метода, соответственно.

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

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

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

0 голосов
/ 08 сентября 2017

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

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

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

...