Является ли «StringBuilder» приложение шаблона проектирования Builder?

Является ли шаблон «Builder» ограниченным для обращения к анти-шаблону «телескопического конструктора», или можно сказать, что он также относится к более общей проблеме сложного создания неизменяемых объектов?

Класс StringBuilder имеет имя «строитель» в его имени, но он не имеет ничего общего с конструкторами телескопов, он просто помогает мы собираем все данные, которые нам нужно передать конструктору неизменяемого объекта.

Мне кажется, что ответ - очень четкое «да», но, похоже, есть некоторые разногласия по этой теме, поэтому я надеялся, что кто-то может это прояснить.

Я отвечал на этот вопрос: Программисты SE: законная «настоящая работа» в конструкторе? , где OP хочет создать (предположительно неизменяемый) объект, содержащий сложное дерево, и возникла идея шаблона «строитель», и, исследуя его, я нашел этот Q & A, который, кажется, говорит, что стиль создания объекта StringBuilder not приложение шаблона «Builder» по причинам, которые мне не понятны: Stackoverflow - шаблон StringBuilder и Builder . (Ответы на этот вопрос не смогли сделать убедительный момент, насколько я могу судить.)

31 голос | спросил Mike Nakis 20 SunEurope/Moscow2015-12-20T18:46:50+03:00Europe/Moscow12bEurope/MoscowSun, 20 Dec 2015 18:46:50 +0300 2015, 18:46:50

1 ответ


36

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

  

Отделить конструкцию сложного объекта от его представления, чтобы тот же процесс построения мог создавать разные представления.

     

- от Шаблоны проектирования , Гамма, Шлем, Джонсон, Влиссидес.

(примечание: «сложный» в первую очередь означает «состоящий из нескольких частей», не обязательно «сложный» или «трудный»)

Здесь присутствуют «разные представления». Например. предполагая этот процесс построения:

 interface ArticleBuilder {
  void addTitle(String title);
  void addParagraph(String paragraph);
}

void createArticle(ArticeBuilder articleBuilder) {
  articleBuilder.addTitle("Is String Builder an application of ...");
  articleBuilder.addParagraph("Is the Builder Pattern restricted...");
  articleBuilder.addParagraph("The StringBuilder class ...");
}

мы можем получить код HtmlDocument или TexDocument или MarkdownDocument в зависимости от конкретной реализации:

 class HtmlDocumentBuilder implements ArticleBuilder {
  ...
  HtmlDocument getResult();
}

HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();

Таким образом, одной центральной точкой шаблона Builder является полиморфизм . В книге Design Patterns сравнивается этот шаблон с абстрактной фабрикой:

  

Абстрактная фабрика похожа на Builder, так как она также может создавать сложные объекты. Основное различие заключается в том, что шаблон Builder фокусируется на построении сложного объекта шаг за шагом. [...] Builder возвращает продукт в качестве последнего шага, но в отношении абстрактной фабрики продукт сразу возвращается.

     

- от Шаблоны проектирования , Гамма, Шлем, Джонсон, Влиссидес.

Этот поэтапный аспект затем стал более популярным аспектом шаблона Builder, так что в общем выражении шаблон Builder понимается следующим образом:

  

Разделить конструкцию объекта на несколько шагов. Это позволяет нам использовать именованные аргументы или необязательные параметры даже на языках, которые не поддерживают эти функции.

Википедия определяет шаблон следующим образом:

  

Шаблон-строитель представляет собой шаблон разработки программного обеспечения для создания объектов. В отличие от абстрактного шаблона фабрики и шаблона фабричного метода, целью которого является включение полиморфизма, намерение шаблона-строителя состоит в том, чтобы найти решение для конструктора телескопа-анти-шаблона [править] . [...]

     

У шаблона строителя есть еще одно преимущество. Он может использоваться для объектов, содержащих плоские данные (html-код, SQL-запрос, сертификат X.509 ...), то есть данные, которые нельзя легко отредактировать. Этот тип данных не может редактироваться шаг за шагом и должен быть отредактирован сразу. Лучший способ построить такой объект - использовать класс строителя. [править]

     

- от шаблон построителя в Wikipedia , различными вкладчиками.

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

Единственное общее свойство StringBuilder с различными интерпретациями шаблона заключается в том, что продукт создается шаг за шагом, а не в одном идти. Он не соответствует строгому описанию определения шаблона дизайна GoF, но обратите внимание, что шаблоны проектирования - это гибкие концепции, предназначенные для облегчения общения. Я бы продолжил называть StringBuilder пример шаблона Builder, хотя и нетипичный - основная причина для этой структуры в Java - это конкатенация в присутствии неизменяемых строк, но не какой-то интересный объектно-ориентированный дизайн.

ответил amon 20 SunEurope/Moscow2015-12-20T19:25:23+03:00Europe/Moscow12bEurope/MoscowSun, 20 Dec 2015 19:25:23 +0300 2015, 19:25:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132