Có phải String Stringilder là một ứng dụng của Mẫu thiết kế Builder?


31

Có phải mẫu "Builder" bị hạn chế trong việc xử lý mẫu chống "nhà xây dựng kính thiên văn" hay có thể nói là cũng giải quyết vấn đề chung hơn về việc tạo ra các vật thể bất biến?

Các StringBuilderlớp học có từ "xây dựng" trong tên của nó, nhưng nó không có gì để làm với telescoping nhà xây dựng, nó chỉ đơn giản giúp chúng ta thu thập tất cả các dữ liệu mà chúng tôi cần phải vượt qua để các nhà xây dựng của một đối tượng không thay đổi.

Đối với tôi có vẻ như câu trả lời là "có" rất rõ ràng, nhưng dường như có một số bất đồng về chủ đề này, vì vậy tôi đã hy vọng rằng ai đó có thể làm rõ nó.

Tôi đã trả lời câu hỏi này: Lập trình viên SE: Hợp pháp làm việc thực tế trực tiếp trong một nhà xây dựng? Trong đó OP muốn tạo ra một đối tượng (có lẽ là bất biến) có chứa một cây phức tạp và ý tưởng về mô hình "người xây dựng" đã xuất hiện, và trong khi nghiên cứu nó, tôi đã tìm thấy Q & A này có vẻ như nói rằng phong cách tạo đối tượng "StringBuilder" là không phải là một ứng dụng của mẫu "Builder", vì những lý do không rõ ràng đối với tôi: Stackoverflow - StringBuilder và Builder Pattern . (Những người trả lời câu hỏi đó không thể đưa ra một điểm thuyết phục theo như tôi có thể nói.)


2
Tôi thấy câu trả lời của Paul Sasik về câu hỏi Stack Overflow hoàn toàn thuyết phục: StringBuilder là một "cách giải quyết" cho vấn đề hiệu năng của việc nối các chuỗi bất biến, không gì khác. Tốt nhất, StringBuilder là "không may được đặt tên." Bạn có thể đưa ra lập luận rằng StringBuilder có thể "xây dựng" các trang web, tôi cho rằng, nhưng đó là một ứng dụng cụ thể của một cơ chế chung.
Robert Harvey

3
Câu trả lời của Paul Sasik là sai đối với Java - Tôi đã xem mã nguồn cơ bản. StringBuilderdường như sử dụng một mảng ký tự bên dưới để thể hiện Chuỗi và cho phép bạn thực hiện những việc như chèn và xóa bất kỳ lúc nào. Cuối cùng, tôi nghĩ rằng StringBuilder là một cách giải quyết cho các đối tượng String không thay đổi, nhưng nếu không thì nó trông giống như nó đáp ứng mục đích của mẫu Builder.
Thomas Owens

4
Tôi cần phải suy nghĩ về điều này nhiều hơn nữa - nó làm phiền tôi. Tôi gần như bắt đầu viết lên lý do tại sao một cái gì đó như StringBuilder là một phiên bản của mẫu Builder và mọi người khác đều sai. Nhưng tôi đã tìm thấy một vài điểm yếu, tự thuyết phục mình rằng tôi đã sai, nhưng sau đó đã xoay sở để lấy lại suy nghĩ đầu tiên của mình. Nếu bạn chỉ nhìn vào mục đích của mẫu Builder, thật dễ dàng để thấy rằng "StringBuilder là một Builder". Nếu bạn nhìn vào cấu trúc của mẫu Builder, nó khó hơn.
Thomas Owens

1
Đối với những gì đáng giá, câu trả lời này trên Stack Overflow đồng ý với suy nghĩ ban đầu của tôi rằng StringBuilder là một triển khai của trình xây dựng và các nhận xét rất thú vị. Vì vậy, bạn có thể tìm thấy cả hai mặt của tranh luận. Tôi thích câu hỏi này - tôi không biết liệu tôi có thể xây dựng một câu trả lời hay không, nhưng chắc chắn đó là một câu hỏi thú vị. Tôi sẽ suy nghĩ về điều này.
Thomas Owens

2
Không phải tất cả các mẫu GoF đều đứng trước thử thách của thời gian. Tôi không nói , tôi chỉ nói thôi.
Bến

Câu trả lời:


36

A StringBuildertương tự như Mẫu xây dựng, nhưng không chia sẻ nhiều với mô tả GoF của mẫu thiết kế này. Điểm ban đầu của mẫu thiết kế là

Tách việc xây dựng một đối tượng phức tạp khỏi biểu diễn của nó để cùng một quá trình xây dựng có thể tạo ra các biểu diễn khác nhau.

- từ Mẫu thiết kế , bởi Gamma, Helm, Johnson, Vlissides.

(lưu ý: Phần mềm phức tạp, chủ yếu có nghĩa là Phần tử gồm nhiều phần, không nhất thiết phải là phức tạp

Các đại diện khác nhau của người Viking là chìa khóa ở đây. Ví dụ, giả sử quá trình xây dựng này:

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 ...");
}

chúng tôi có thể kết thúc bằng một HtmlDocumenthoặc một TexDocumenthoặc MarkdownDocumenttùy thuộc vào việc triển khai cụ thể được cung cấp:

class HtmlDocumentBuilder implements ArticleBuilder {
  ...
  HtmlDocument getResult();
}

HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();

Vì vậy, một điểm trung tâm của mẫu Builder là đa hình . Cuốn sách Mẫu thiết kế so sánh mẫu này với Nhà máy trừu tượng:

Tóm tắt Factory tương tự như Builder ở chỗ nó cũng có thể xây dựng các đối tượng phức tạp. Sự khác biệt chính là mẫu Builder tập trung vào việc xây dựng một đối tượng phức tạp từng bước. [V]] Builder trả lại sản phẩm là bước cuối cùng, nhưng theo như Nhà máy Trừu tượng có liên quan, sản phẩm sẽ được trả lại ngay lập tức.

- từ Mẫu thiết kế , bởi Gamma, Helm, Johnson, Vlissides.

Khía cạnh từng bước này sau đó đã trở thành khía cạnh phổ biến hơn của mẫu Builder, do đó theo cách nói chung, mẫu Builder được hiểu như sau:

Chia xây dựng một đối tượng thành nhiều bước. Điều này cho phép chúng tôi sử dụng các đối số được đặt tên hoặc tham số tùy chọn ngay cả trong các ngôn ngữ không hỗ trợ các tính năng này.

Wikipedia định nghĩa mô hình như thế này:

Mẫu xây dựng là một mẫu thiết kế phần mềm tạo đối tượng. Không giống như mẫu nhà máy trừu tượng và mẫu phương thức nhà máy có ý định kích hoạt tính đa hình, mục đích của mẫu xây dựng là tìm giải pháp cho mẫu chống xây dựng kính viễn vọng [cần dẫn nguồn] . [Càng]

Các mô hình xây dựng có một lợi ích khác. Nó có thể được sử dụng cho các đối tượng chứa dữ liệu phẳng (mã html, truy vấn SQL, chứng chỉ X.509 ...), nghĩa là dữ liệu không thể chỉnh sửa dễ dàng. Loại dữ liệu này không thể được chỉnh sửa từng bước và phải được chỉnh sửa cùng một lúc. Cách tốt nhất để xây dựng một đối tượng như vậy là sử dụng lớp trình xây dựng. [cần dẫn nguồn]

- từ Builder Model trên Wikipedia , bởi những người đóng góp khác nhau.

Vì vậy, như chúng ta có thể thấy, không có sự hiểu biết thực sự phổ biến về mẫu mà tên này đề cập đến, và trong một số điểm, các định nghĩa khác nhau thậm chí trái ngược với nhau (ví dụ về sự liên quan của đa hình cho Nhà xây dựng).

Thuộc tính chung duy nhất của StringBuildervới các cách hiểu khác nhau về mẫu là sản phẩm được tạo ra từng bước chứ không phải trong một lần. Nó không đáp ứng việc đọc nghiêm ngặt định nghĩa của GoF về mẫu thiết kế, nhưng xin lưu ý rằng các mẫu thiết kế là các khái niệm dễ uốn có nghĩa là để tạo thuận lợi cho giao tiếp. Tôi sẽ tiếp tục gọi StringBuildermột ví dụ về Mẫu xây dựng, mặc dù là một mẫu không điển hình - lý do chính cho cấu trúc đó trong Java là sự kết hợp biểu diễn với sự có mặt của các chuỗi bất biến, nhưng không phải là một thiết kế hướng đối tượng thú vị.


7
Đối với tôi, dường như việc tạo ra các đối tượng bất biến dường như là một trong những cách sử dụng phổ biến hơn của Nhà xây dựng - Tôi nghĩ rằng điều này đã thay thế việc sử dụng chính như được mô tả bởi GoF, vì vậy đồng ý rằng điều này chắc chắn được mô tả tốt nhất như là một ví dụ của mẫu.
Jules

Đồng ý với việc sử dụng trong việc tạo các biểu đồ bất biến, Một usecase khác cho Builder DSL thực sự hữu ích để tạo các biểu đồ lớn của dữ liệu Fake / ObjectMothers trong Đơn vị + Kiểm tra tích hợp.
StuartLC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.