[Design pattern] Builder Pattern và biến thể
Vấn đề: Giả sử là có một object được tạo ra với nhiều bước phức tạp. Ví dụ như xây nhà phải xây cửa sổ, xây móng, xây cửa chính, ....
Ý tưởng:
1. Tạo ra một Class HouseBuilder
2. Định nghĩa các method build_window, build_door và quan trọng nhất là hàm build
3. Mỗi method build_window sẽ return self.
Code:
class House:
def __init__(self):
# Khai báo sẵn các thuộc tính để dễ quản lý
self.window = None
self.door = None
def __str__(self):
# Thêm hàm này để in ra kết quả cho trực quan
return f"House with Window: {self.window}, Door: {self.door}"
class HouseBuilder:
def __init__(self):
# Builder tự khởi tạo đối tượng thay vì nhận từ bên ngoài
self.house = House()
def build_window(self, window: str):
self.house.window = window
return self
def build_door(self, door: str):
self.house.door = door
return self
def build(self):
return self.house
# Client code
house = (
HouseBuilder()
.build_window("WINDOW")
.build_door("DOOR")
.build()
)
print(house)
SAI LẦM:
tức là gọi class House, nhưng bên trong định nghĩa những method build_window, build_door
Biến Thể: Step builder pattern (bắt người dùng phải nhập theo thứ tự 1 -> 2, ...)
Biến thể trên thì là sự kết hợp giữa state pattern và builder pattern
LƯU Ý: Bởi vì builder pattern không ép buộc phải điền hết nên là mới sinh ra step builder pattern, nhưng trong python thì step builder pattern vẫn bị bỏ qua bình thường và sẽ báo lỗi khi chạy runtime chứ không báo lỗi compile như java, c#
Nhận xét
Đăng nhận xét