Я нашел тот же вопрос очень интересным.
Пример автомобиля 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 - попробуйте ответить на эти вопросы:
Какую точку зрения вы предпочитаете иметь в отношении этой конкретной части системы? Это «поведение» или «творчество»? и
Требуется ли вам сильная инкапсуляция, или динамическая замена, или развертывание, или настройка экземпляра построителя, с одной стороны, или вы ожидаете, что сложность (за счет наследования, композиции или иным образом) будет развиваться вокруг процесса создания или метода шаблона? Если ответ на любой из этих вопросов, обратитесь к структуре Строителя / Стратегии. В противном случае используйте простой полиморфизм отношения или поведения в паттернах метода XX.
person
Ron
schedule
02.07.2012