Ограничен ли шаблон «Строитель» обращением к анти-шаблону «телескопический конструктор», или можно сказать, что он также решает более общую проблему сложного создания неизменяемых объектов?
У StringBuilder
класса есть слово «строитель» в его имени, но он не имеет ничего общего с телескопическими конструкторами, он просто помогает нам собрать все данные, которые нам нужно передать конструктору неизменного объекта.
Мне кажется, что ответ - это очень четкое «да», но, похоже, есть некоторые разногласия по этой теме, поэтому я надеялся, что кто-то, возможно, сможет это прояснить.
Я отвечал на этот вопрос: программисты SE: законная «реальная работа» в конструкторе? где OP хочет создать (предположительно неизменный) объект, содержащий сложное дерево, и идея шаблона «строителя» всплыла, и во время исследования я нашел этот вопрос и ответ, который, кажется, говорит, что стиль создания объекта «StringBuilder» не применение шаблона «Builder» по причинам, которые мне не ясны: Stackoverflow - StringBuilder и Builder Pattern . (Насколько я могу судить, те, кто отвечал на этот вопрос, не смогли сделать убедительный вывод)
источник
StringBuilder
кажется, использует базовый символьный массив для представления String и позволяет вам делать такие вещи, как вставки и удаления в любой точке. В конечном счете, я думаю, что StringBuilder - это обходной путь для неизменяемых объектов String, но в остальном мне кажется, что он соответствует замыслу шаблона Builder.Ответы:
A
StringBuilder
похож на шаблон Builder, но не очень похож на описание GoF этого шаблона проектирования. Первоначальная точка шаблона дизайна была(примечание: «сложный» в первую очередь означает «составленный из нескольких частей», не обязательно «сложный» или «сложный»)
«Различные представления» является ключевым здесь. Например, предполагая этот процесс строительства:
мы можем в конечном итоге получить a
HtmlDocument
или aTexDocument
или a вMarkdownDocument
зависимости от того, какая конкретная реализация предоставляется:Таким образом, одной из центральных точек шаблона Builder является полиморфизм . Книга Design Patterns сравнивает этот шаблон с абстрактной фабрикой:
Этот пошаговый аспект стал более популярным аспектом шаблона Builder, так что в общем смысле шаблон Builder понимается так:
Википедия определяет шаблон следующим образом:
Таким образом, как мы можем видеть, нет действительно общего понимания того, к какому шаблону относится это имя, и в некоторых моментах разные определения даже противоречат друг другу (например, в отношении актуальности полиморфизма для Строителей).
Единственное общее свойство
StringBuilder
различных интерпретаций шаблона заключается в том, что продукт создается шаг за шагом, а не за один раз. Он не соответствует строгому прочтению определения шаблона проектирования GoF, но, пожалуйста, обратите внимание, что шаблоны проектирования - это гибкие концепции, предназначенные для облегчения коммуникации. Я бы продолжил называтьStringBuilder
пример паттерна построителя, хотя и нетипичным, - главная причина этой структуры в Java - конкатенация с производительностью при наличии неизменяемых строк, но не какой-то интересный объектно-ориентированный дизайн.источник