[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

Bài đăng phổ biến từ blog này

TÚM CÁI VÁY

Kì 2023.2 ở HUST

Học quân sự ở HUST có gì vui ?