Capstone: Pizza Store đa vùng và toppings
Xây Pizza Store nhiều vùng bằng Factory Method và Abstract Factory, chồng topping bằng Decorator và chốt bảng giá chính xác.
KhóDesign pattern ~120 phút
Ôn lại trước khi học
Giới thiệu
Bạn mở tiệm pizza nhiều vùng. Mỗi vùng có công thức riêng nhưng gọi chung một cách.
Kiến thức cần nhớ
Factory Method
- Factory Method gom việc tạo bánh vào một chỗ.
- Định nghĩa: code gọi chung, lớp con quyết định loại bánh.
- Ví dụ đời thường: giống quầy gọi món chung cho nhiều bếp.
- Thêm vùng mới thì thêm lớp mới, không sửa chỗ gọi.
Abstract Factory
- Abstract Factory tạo cả bộ nguyên liệu hợp nhau.
- Ví dụ đời thường: giống combo bếp vùng nào đồ vùng đó.
- Bảo đảm phô mai và sốt cùng một vùng.
- Đổi vùng là đổi cả bộ một lần.
Decorator và giá
- Decorator chồng thêm topping mà không sửa bánh gốc.
- Ví dụ đời thường: giống thêm topping lên bánh có sẵn.
- Mỗi lớp topping cộng thêm tiền của nó.
- Giá cuối bằng giá bánh cộng mọi topping.
# decorator cộng giá topping
class Banh: # bánh gốc
def gia(self):
return 100 # giá gốc
class ThemPhomai: # lớp topping bọc ngoài
def __init__(self, banh):
self.banh = banh # giữ bánh gốc
def gia(self):
return self.banh.gia() + 20 # cộng thêm tiền
Ví dụ
- Bánh 100 + phô mai 20 -> giá 120.
- Đổi vùng Hà Nội sang Sài Gòn -> cả bộ nguyên liệu đổi theo.
💻 Bài tập
Ngôn ngữ: C++17 (hoặc Java). Dùng code ngày 117. Nộp vào day-158-capstone/.
Bài 1: Pizza Store đa vùng
Mở rộng project ngày 117 thành 4 vùng: NY, Chicago, California, Hà Nội.
| Vùng | Đặc trưng nguyên liệu |
|---|---|
| Hà Nội | Bột mỏng, sốt cà chua, phô mai mozzarella, thêm rau thơm |
Mỗi vùng có 4 loại pizza. Test: mọi pizza của mọi vùng chỉ chứa nguyên liệu vùng đó (test sinh tự động cho 16 tổ hợp).
Bài 2: Topping, combo và khuyến mãi
- 8 topping (Decorator). Giới hạn tối đa 5 topping mỗi pizza: topping thứ 6 ném lỗi.
- Combo: pizza + nước + khoai là
ComboItem(Composite), giá combo giảm 10% tổng. - Khuyến mãi là Strategy:
NoPromo,BuyTwoGetOne(rẻ nhất miễn phí),WeekdayDiscount(15%),CouponCode(code, amount). - Hóa đơn in từng dòng, topping thụt lề, dòng giảm giá, tổng.
Đơn: NY cheese + ExtraCheese, Chicago veggie, Hà Nội pepperoni + 2 topping; khuyến mãi BuyTwoGetOne
-> pizza rẻ nhất miễn phí, in đúng hóa đơn
Bài 3: Chỉ số thiết kế (nâng cao)
- Đếm số lớp, số dòng, độ sâu kế thừa lớn nhất.
- Thực hiện 3 thay đổi: thêm vùng Đà Nẵng, thêm topping trứng muối, thêm khuyến mãi "sinh nhật giảm 50% 1 pizza". Ghi
git diff --stattừng cái. DESIGN.md: sơ đồ, bảng pattern (Factory Method, Abstract Factory, Decorator, Composite, Strategy), chỗ thiết kế còn cứng.
✅ Tiêu chí hoàn thành
- 16 tổ hợp vùng x loại pass test nguyên liệu.
- Giới hạn topping và combo có test.
- 4 khuyến mãi có test với số tiền cụ thể.
- 3 thay đổi có số liệu
git diff --stat.
❓ Câu hỏi ôn tập
- Factory gom việc gì vào một chỗ?
- Abstract Factory tạo mấy món một lần?
- Decorator có sửa bánh gốc không?
- Giá cuối tính thế nào?
🌕 Bạn đã hoàn thành ngày 158. Làm hết bài tập phía trên rồi sang ngày tiếp theo.