A StringBuilder
jest podobny do Wzorca Konstruktora, ale niewiele dzieli z opisem GoF tego wzorca projektowego. Pierwotnym punktem wzoru projektowego było
Oddziel konstrukcję złożonego obiektu od jego reprezentacji, aby ten sam proces budowy mógł tworzyć różne reprezentacje.
- od Design Patterns , Gamma, Helm, Johnson, Vlissides.
(uwaga: „złożony” oznacza przede wszystkim „złożony z wielu części”, niekoniecznie „skomplikowany” lub „trudny”)
Kluczowe są tutaj „różne reprezentacje”. Np. Zakładając ten proces budowy:
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 ...");
}
możemy skończyć na a HtmlDocument
lub a TexDocument
lub w MarkdownDocument
zależności od tego, jakie konkretne wdrożenie jest zapewnione:
class HtmlDocumentBuilder implements ArticleBuilder {
...
HtmlDocument getResult();
}
HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();
Tak więc jednym centralnym punktem wzoru Konstruktora jest polimorfizm . Książka Wzory wzorów porównuje ten wzór z Fabryką abstrakcyjną:
Fabryka abstrakcyjna jest podobna do Konstruktora, ponieważ również może konstruować złożone obiekty. Podstawowa różnica polega na tym, że wzorzec Konstruktora koncentruje się na konstruowaniu złożonego obiektu krok po kroku. […] Konstruktor zwraca produkt jako ostatni krok, ale jeśli chodzi o fabrykę abstrakcyjną, produkt jest natychmiast zwracany.
- od Design Patterns , Gamma, Helm, Johnson, Vlissides.
Ten aspekt krok po kroku stał się bardziej popularnym aspektem wzorca konstruktora, dzięki czemu we wspólnej mowie wzorzec konstruktora jest rozumiany w następujący sposób:
Podziel konstrukcję obiektu na wiele kroków. To pozwala nam używać nazwanych argumentów lub parametrów opcjonalnych nawet w językach, które nie obsługują tych funkcji.
Wikipedia definiuje następujący wzór:
Wzorzec konstruktora to wzorzec projektowy oprogramowania do tworzenia obiektów. W przeciwieństwie do abstrakcyjnego wzorca fabrycznego i wzorca metody fabrycznej, którego celem jest umożliwienie polimorfizmu, intencją wzorca konstruktora jest znalezienie rozwiązania anty-wzorca teleskopowego konstruktora [potrzebne źródło] . […]
Wzorzec konstruktora ma jeszcze jedną zaletę. Można go używać do obiektów zawierających dane płaskie (kod HTML, zapytanie SQL, certyfikat X.509 ...), to znaczy dane, których nie można łatwo edytować. Tego typu danych nie można edytować krok po kroku i należy je edytować od razu. Najlepszym sposobem na zbudowanie takiego obiektu jest użycie klasy konstruktora. [wymagany cytat]
- z Builder Pattern na Wikipedii , przez różnych autorów.
Jak widzimy, nie ma naprawdę powszechnego zrozumienia, do którego wzorca odnosi się ta nazwa, aw niektórych punktach różne definicje nawet są ze sobą sprzeczne (np. Odnośnie znaczenia polimorfizmu dla Konstruktorów).
Jedyną wspólną właściwością StringBuilder
różnych interpretacji wzoru jest to, że produkt jest tworzony krok po kroku, a nie za jednym razem. Nie spełnia surowej interpretacji definicji wzoru projektowego GoF, ale należy pamiętać, że wzorce projektowe są koncepcjami plastycznymi mającymi na celu ułatwienie komunikacji. Nadal będę nazywał StringBuilder
przykład Wzorca Konstruktora, choć nietypowego - głównym powodem tej struktury w Javie jest wydajna konkatenacja w obecności niezmiennych ciągów, ale nie jakiś interesujący projekt obiektowy.