Hiểu biết cơ bản về Builder pattern

Builder pattern là một mẫu thiết kế thuộc "Nhóm khởi tạo" (Creational Pattern). Mẫu thiết kế này cho phép lập trình viên tạo ra những đối tượng phức tạp nhưng chỉ cần thông qua các câu lệnh đơn giản để tác động nên các thuộc tính của nó. Trong bài này chúng ta sẽ tìm hiểu về mẫu thiết kế này thông qua qua những ví dụ đơn giản kiểu như:

Capture.png

Khi nào thì sử dụng mẫu thiết kế này?

Một lập trình viên muốn sử dụng Builder pattern khi:

  • Anh ấy muốn thay đổi thiết kế cho việc lồng nhau của các hàm khởi tạo (Telescoping Constructor Pattern). Vấn đề này phát sinh khi lập trình viên làm việc với một lớp mà có chứa rất nhiều các thuộc tính và cần phải tạo ra nhiều hàm khởi tạo với số lượng các thuộc tính tăng dần.
  • Anh ấy cần tạo ra một đối tượng phức tạp, một đối tượng mà thuật toán để tạo tạo lập các thuộc tính là độc lập đối với các thuộc tính khác.

Cách thức triển khai thế nào?

Mặc định, cách thức triển khai thông thường của Builder pattern gồm có 4 thành phần cơ bản:

builder-pattern.png

  • Builder : là thành phần định nghĩa một lớp trừu tượng (abstract class) để tạo ra một hoặc nhiều phần của đối tượng Product
  • ConcreateBuilder : là thành phần triển khai, cụ thể hóa các lớp trừu tượng cho để tạo ra các thành phần và tập hợp các thành phần đó với nhau. thành phần này sẽ xác định và nắm giữ các thể hiện mà nó tạo ra. Đồng thời nó cũng cung cấp phương thức để trả các các thể hiện mà nó đã tạo ra trước đó.
  • Product : thành phần này trong bài viết sẽ đại diện cho đối tượng phức tạp phải tạo ra.
  • Director: thành phần này sẽ khởi tạo đối tượng Builder

Bây giờ, chúng ta hãy cùng xem một ví dụ để hiểu hơn về mẫu thiết kế này.

Trog ví dụ này, chúng ta sẽ tạo ra một căn phòng thông qua giao diện (Interface) khởi tạo. Ở đây, lớp trừu tượng của chúng ta sẽ là lớp RoomBuilder. Nó cung cấp một giao diện để có thể thêm hoặc xóa đi các cửa sổ của căn phòng. Sau đó sẽ trả về một thể hiện của căn phòng cho chúng ta.

builder.png

Và tiếp theo đây chính là thành phần ConcreateBuilder mà chúng ta đã đề câp ở phần trên, ở đây tôi sẽ đặt tên cho nó là BedRoomBuilder. Nó sẽ bao gồm một thuộc tính là thể hiện của lớp BedRoom. BedRoom chính là thành phần Product mà chúng ta đã nói ở trên, và trong ví dụ này chúng ta sẽ cần tạo ra đối tượng BedRoom.

bedroom.png

Cuối cùng Director sử dụng builder để tạo ra một căn phòng phù hợp với những cài đặt mong muốn:

director.png

Builder pattern với tính chất kế thừa

Đôi khi chung ta cần một lớp builder trừu tượng để có thể tạo ra một Product có các đặc điểm chung, để rồi các lớp builder con sẽ định nghĩa lại các phương thức cần thiết.

Dưới đây là lớp Builder trừu tượng đã được triển khai

abstract.png

Phương thức selft() ở dòng 14 sẽ trả ra thể hiện của Builder trong lớp con của nó. Dưới đây là lớp con BedRoomBuilder

subclass.png

và trong Director cũng ta sẽ cài đặt như sau: sub-driector.png

Reference links: