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

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ộiBộ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

  1. 8 topping (Decorator). Giới hạn tối đa 5 topping mỗi pizza: topping thứ 6 ném lỗi.
  2. Combo: pizza + nước + khoai là ComboItem (Composite), giá combo giảm 10% tổng.
  3. Khuyến mãi là Strategy: NoPromo, BuyTwoGetOne (rẻ nhất miễn phí), WeekdayDiscount(15%), CouponCode(code, amount).
  4. 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)

  1. Đếm số lớp, số dòng, độ sâu kế thừa lớn nhất.
  2. 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 --stat từng cái.
  3. 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

  1. Factory gom việc gì vào một chỗ?
  2. Abstract Factory tạo mấy món một lần?
  3. Decorator có sửa bánh gốc không?
  4. 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.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.