Ý tưởng
Builder Pattern (Builder Pattern) là một mẫu thiết kế tạo đối tương (creational design pattern), cho phép bạn tạo ra các đối tượng phức tạp bằng cách xây dựng chúng theo từng bước. Mẫu thiết kế này cho phép bạn sử dụng cùng một mã tạo ra các đối tượng khác nhau về loại và hình thức.
Bằng cách sử dụng Builder Pattern, người dùng chỉ cần chỉ định loại đối tượng cần tạo, không cần biết về quá trình xây dựng cụ thể và chi tiết.
Builder Pattern cho phép thay đổi cách biểu diễn nội bộ của một sản phẩm.
Nó tách biệt mã xây dựng và mã biểu diễn.
Nó kiểm soát quá trình xây dựng một cách tốt.
Giải thích quy trình Builder Pattern:
- Client tạo đối tượng Director và cấu hình các đối tượng Builder cần thiết.
- Director chịu trách nhiệm thông báo cho builder khi nào cần xây dựng các thành phần của sản phẩm.
- Builder xử lý yêu cầu từ director và thêm các thành phần của sản phẩm.
- Client nhận được sản phẩm từ builder.
Tình huống sử dụng
- Sử dụng Builder Pattern để tránh việc sử dụng “hàm tạo chồng chéo (telescopic constructor)“.
- Khi bạn muốn sử dụng mã để tạo ra các sản phẩm khác nhau về hình thức.
- Sử dụng Builder Pattern để xây dựng cây hợp thành hoặc các đối tượng phức tạp khác.
Cấu trúc
- Builder (Builder) là một giao diện khai báo các bước xây dựng sản phẩm chung cho tất cả các loại builder.
- Concrete Builder (Concrete Builders) cung cấp các cài đặt khác nhau cho quá trình xây dựng. Concrete Builder cũng có thể xây dựng các sản phẩm không tuân theo giao diện chung.
- Product (Sản phẩm) là đối tượng cuối cùng được tạo ra. Sản phẩm được xây dựng bởi các builder khác nhau không cần phải thuộc cùng một cấu trúc lớp hoặc giao diện.
- Director (Người chỉ đạo) lớp xác định thứ tự gọi các bước xây dựng, cho phép bạn tạo và tái sử dụng cấu hình sản phẩm cụ thể.
- Client (Khách hàng) phải liên kết một đối tượng builder với lớp Director. Thông thường, bạn chỉ cần liên kết một lần thông qua tham số của phương thức khởi tạo của Director. Tuy nhiên, còn một cách khác để chuyển đối tượng builder cho phương thức xây dựng của Director mỗi lần bạn muốn tạo một sản phẩm với builder khác nhau.
Product (Sản phẩm) là một lớp đại diện cho sản phẩm, được tạo thành từ nhiều thành phần.
Builder
Builder là một giao diện trừu tượng, xác định các phương thức xây dựng các thành phần của sản phẩm A, B và C, và khai báo phương thức getResult để nhận kết quả xây dựng sản phẩm.
ConcreteBuilder
ConcreteBuilder triển khai các phương thức cụ thể của Builder.
Director
Director là lớp điều hành, điều hướng quá trình xây dựng sản phẩm (điều khiển thứ tự xây dựng các thành phần).
Client
Người dùng không cần biết về quá trình xây dựng cụ thể, chỉ cần chỉ định loại sản phẩm cần tạo.
Kết quả
============== Tạo sản phẩm ==============
Phần C
Phần A
Phần B
Pseudocode
Dưới đây là một ví dụ về mẫu thiết kế Builder cho thấy cách bạn có thể tái sử dụng mã xây dựng đối tượng để tạo ra các loại sản phẩm khác nhau - ví dụ: ô tô (Car) và hướng dẫn sử dụng tương ứng (Manual).
Ví dụ
Ví dụ sử dụng: Builder Pattern là một mẫu thiết kế nổi tiếng trong thế giới Java. Nó được sử dụng đặc biệt hữu ích khi bạn cần tạo ra một đối tượng có thể có nhiều tùy chọn cấu hình.
Builder đã được sử dụng rộng rãi trong thư viện cốt lõi của Java:
java.lang.StringBuilder#append()
(không đồng bộ)java.lang.StringBuffer#append()
(đồng bộ)java.nio.ByteBuffer#put()
(cũng nhưCharBuffer
,ShortBuffer
,IntBuffer
,LongBuffer
,FloatBuffer
vàDoubleBuffer
)- Tất cả các lớp triển khai
java.lang.Appendable
Cách nhận biết: Builder Pattern có thể được nhận biết bằng cách xem xét lớp có một phương thức xây dựng và nhiều phương thức cấu hình cho các kết quả đối tượng. Phương thức xây dựng của Builder thường hỗ trợ chuỗi phương thức (ví dụ: someBuilder->setValueA(1)->setValueB(2)->create()
)
Mối quan hệ với các mẫu thiết kế khác
- Trong giai đoạn thiết kế ban đầu của nhiều công việc, Factory Method Pattern được sử dụng (đơn giản hơn và có thể tùy chỉnh dễ dàng hơn thông qua lớp con), sau đó tiến triển thành sử dụng Abstract Factory Pattern, Prototype Pattern hoặc Builder Pattern Pattern (linh hoạt hơn nhưng phức tạp hơn).
- Builder Pattern tập trung vào cách xây dựng đối tượng phức tạp theo từng bước. Abstract Factory Pattern chuyên sản xuất một loạt các đối tượng liên quan. Abstract Factory trả về ngay lập tức sản phẩm, trong khi Builder cho phép bạn thực hiện một số bước xây dựng bổ sung trước khi nhận sản phẩm.
- Bạn có thể sử dụng Builder Pattern khi tạo cây Composite Pattern, vì điều này cho phép các bước xây dựng chạy đệ quy.
- Bạn có thể kết hợp Builder Pattern với Bridge Pattern: Director chịu trách nhiệm về phần trừu tượng, trong khi các Builder khác nhau chịu trách nhiệm về phần cài đặt.
- Abstract Factory Pattern, Builder Pattern và Prototype Pattern có thể được triển khai bằng Singleton Pattern.