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 ...");
}
мы можем в конечном итоге получить a HtmlDocument
или a TexDocument
или a в 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 ...), то есть данные, которые не могут быть легко отредактированы. Данные этого типа не могут быть отредактированы шаг за шагом и должны быть отредактированы сразу. Лучший способ создать такой объект - использовать класс построителя. [нужна цитата]
- из Pattern Builder в Википедии , от разных авторов.
Таким образом, как мы можем видеть, нет действительно общего понимания того, к какому шаблону относится это имя, и в некоторых моментах разные определения даже противоречат друг другу (например, в отношении актуальности полиморфизма для Строителей).
Единственное общее свойство StringBuilder
различных интерпретаций шаблона заключается в том, что продукт создается шаг за шагом, а не за один раз. Он не соответствует строгому прочтению определения шаблона проектирования GoF, но, пожалуйста, обратите внимание, что шаблоны проектирования - это гибкие концепции, предназначенные для облегчения коммуникации. Я бы продолжил называть StringBuilder
пример паттерна построителя, хотя и нетипичным, - главная причина этой структуры в Java - конкатенация с производительностью при наличии неизменяемых строк, но не какой-то интересный объектно-ориентированный дизайн.