Czy wzorzec „Konstruktora” ogranicza się do rozwiązania anty-wzorca „konstruktora teleskopowego”, czy też można powiedzieć, że dotyczy również bardziej ogólnego problemu skomplikowanego tworzenia niezmiennych obiektów?
StringBuilder
Klasy ma słowo „budowniczy” w nazwie, ale to nie ma nic, teleskopowe do czynienia z konstruktorów, to po prostu pomaga nam zebrać wszystkie dane, które musimy przekazać do konstruktora obiektu niezmiennej.
Wydaje mi się, że odpowiedź jest bardzo wyraźnym „tak”, ale wydaje się, że istnieje pewna różnica zdań na ten temat, więc miałem nadzieję, że ktoś może to wyjaśnić.
Odpowiedziałem na to pytanie: programiści SE: Uzasadniona „prawdziwa praca” w konstruktorze? gdzie OP chce stworzyć (przypuszczalnie niezmienny) obiekt zawierający złożone drzewo, a pojawił się pomysł wzorca „konstruktora”, a podczas badania go znalazłem pytania i odpowiedzi, które wydają się wskazywać, że styl tworzenia obiektów „StringBuilder” jest nie zastosowanie wzorca „Builder” z powodów, które nie są dla mnie jasne: Stackoverflow - StringBuilder i Builder Pattern . (Ci, którzy odpowiedzieli na to pytanie, nie przedstawili przekonującego argumentu, o ile mogę powiedzieć.)
źródło
StringBuilder
wygląda na to, że używa podstawowej tablicy znaków do reprezentowania Ciągu i umożliwia wykonywanie czynności takich jak wstawianie i usuwanie w dowolnym momencie. Ostatecznie myślę, że StringBuilder jest obejściem dla niezmiennych obiektów String, ale poza tym wygląda mi na to, że spełnia założenia wzorca Builder.Odpowiedzi:
A
StringBuilder
jest podobny do Wzorca Konstruktora, ale niewiele dzieli z opisem GoF tego wzorca projektowego. Pierwotnym punktem wzoru projektowego było(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:
możemy skończyć na a
HtmlDocument
lub aTexDocument
lub wMarkdownDocument
zależności od tego, jakie konkretne wdrożenie jest zapewnione:Tak więc jednym centralnym punktem wzoru Konstruktora jest polimorfizm . Książka Wzory wzorów porównuje ten wzór z Fabryką abstrakcyjną:
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:
Wikipedia definiuje następujący wzór:
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.źródło