A StringBuilder
схожий з шаблоном Builder, але не дуже поділяє опис GoF для цього шаблону дизайну. Оригінальною точкою дизайнерського зразка був
Відокремте побудову складного об'єкта від його подання, щоб той самий процес будівництва міг створювати різні уявлення.
- від Design Patterns , від Gamma, Helm, Johnson, Vlissides.
(зауважте: "складний" насамперед означає "складається з декількох частин", не обов'язково "складних" або "важких")
Тут є ключовим "різні уявлення". Наприклад, якщо цей будівельний процес:
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();
Отже, однією з центральних точок картини Будівельника є поліморфізм . Книга «Шаблони дизайну» порівнює цю схему з «Фабрикою абстрактних:
Abstract Factory схожий на Builder тим, що він також може будувати складні об'єкти. Основна відмінність полягає в тому, що модель Builder фокусується на побудові складного об'єкта поетапно. […] Builder повертає продукт як завершальний крок, але що стосується абстрактної фабрики, то продукт повертається негайно.
- від Design Patterns , від Gamma, Helm, Johnson, Vlissides.
Цей покроковий аспект потім став більш популярним аспектом шаблону Builder, так що в загальному розумінні шаблон Builder розуміється так:
Розбиття об’єкта на кілька етапів. Це дозволяє нам використовувати названі аргументи або необов’язкові параметри навіть у мовах, які не підтримують ці функції.
Вікіпедія визначає такий зразок:
Шаблон конструктора - це модель дизайну програмного забезпечення для створення об'єктів. На відміну від абстрактного фабричного малюнка та фабричного методу, метою якого є включення поліморфізму, задум конструктора полягає у пошуку рішення антитілесного конструктора телескопічного конструктора [потрібна цитата] . […]
Модель будівельника має ще одну перевагу. Його можна використовувати для об'єктів, які містять плоскі дані (html-код, SQL-запит, сертифікат X.509 ...), тобто дані, які неможливо легко редагувати. Цей тип даних не можна редагувати поетапно і їх слід редагувати відразу. Найкращий спосіб побудови такого об’єкта - використовувати клас будівельника. [потрібна цитата]
- із " Шаблон будівельника" у Вікіпедії , від різних дописувачів.
Отже, як ми бачимо, немає по-справжньому загального розуміння того, до якого шаблону відноситься ця назва, а в деяких точках різні визначення навіть суперечать одне одному (наприклад, щодо актуальності поліморфізму для будівельників).
Єдиною загальною властивістю StringBuilder
різних інтерпретацій шаблону є те, що продукт створюється поетапно, а не за один раз. Це не відповідає чіткому читанню визначення GoF щодо схеми дизайну, але зауважте, що дизайнерські зразки - це податливі поняття, призначені для полегшення спілкування. Я б продовжував називати StringBuilder
приклад шаблону Builder, хоч і нетиповий - головна причина такої структури в Java - це конкатенація, що є незмінною за наявності незмінних рядків, але не якийсь цікавий об'єктно-орієнтований дизайн.