Project: Pizza Store bằng Factory và Decorator
Đề xây Pizza Store đa vùng bằng Factory Method Abstract Factory và cộng topping bằng Decorator, kèm rubric.
KhóDesign pattern ~120 phút
Ôn lại trước khi học
Giới thiệu
Bài này xây tiệm pizza 2 vùng và cộng topping dồn. Dùng để thêm vùng mới không sửa khung cũ.
Kiến thức cần nhớ
Khung Factory Method
- Khung chung giữ quy trình đặt nướng cắt đóng hộp.
- Mỗi vùng tự định nghĩa khâu tạo pizza riêng mình.
- Khung không biết tên pizza cụ thể của vùng.
- Ví dụ đời thường: như trụ sở ra quy trình, chi nhánh nấu.
- Thêm vùng California chỉ thêm 1 chi nhánh mới.
Xưởng Abstract Factory
- Mỗi vùng có xưởng bột sốt phô mai riêng biệt.
- Pizza hỏi từng món ở bước chuẩn bị nấu.
- Đảm bảo 1 chiếc cùng vùng không lẫn nguyên liệu.
- Ví dụ đời thường: như combo bếp vùng không lẫn vị.
- Pizza không biết tên xưởng cụ thể phía sau.
| Khâu | Pattern | Việc duy nhất |
|---|---|---|
| Tạo pizza vùng | Factory Method | Chi nhánh tự tạo |
| Bộ nguyên liệu | Abstract Factory | Cùng vùng đồng bộ |
| Cộng topping | Decorator | Bọc và cộng dồn |
Decorator topping
- Mỗi topping là 1 lớp bọc giữ pizza bên trong.
- Hỏi giá thì cộng dồn, hỏi tên thì nối chuỗi.
- Thêm ô liu chỉ thêm 1 lớp bọc mới.
- Ví dụ đời thường: như dán sticker giá cộng dồn nhau.
- Không sửa pizza cũ khi thêm topping mới.
Ví dụ
- Input: pizza phô mai + sữa + nấm -> Output: giá cộng 3 lớp.
- Giải thích: mỗi bọc cộng 1 phần rồi chuyển vào trong.
# Bọc topping cộng dồn giá
banh = PizzaPhoMai() # bánh gốc
banh = Sua(banh) # bọc sữa
banh = Nam(banh) # bọc nấm
print(banh.gia()) # tổng 3 lớp
💻 Bài tập
Ngôn ngữ: C++17 (hoặc Java). Đây là project, dành 90 phút. Dùng lại code ngày 12, 25, 74. Nộp vào day-117-pizza/.
Bài 1: Khung cửa hàng và nguyên liệu
| Thành phần | Pattern | Yêu cầu |
|---|---|---|
PizzaStore::orderPizza(type) | Factory Method | Quy trình chung prepare, bake, cut, box. createPizza để chi nhánh ghi đè |
NYPizzaStore, ChicagoPizzaStore | Mỗi chi nhánh bán cheese, veggie, clam | |
PizzaIngredientFactory | Abstract Factory | 1 xưởng mỗi vùng: bột, sốt, phô mai, rau, nghêu |
Pizza | Không biết vùng nào, chỉ hỏi xưởng |
Bài 2: Topping và hóa đơn
| Thành phần | Pattern | Yêu cầu |
|---|---|---|
PizzaItem (interface có description(), cost()) | Pizza cài interface này | |
ToppingDecorator | Decorator | ExtraCheese +15k, Olive +10k, Mushroom +12k, Bacon +20k |
Order | Nhiều PizzaItem, in hóa đơn có từng dòng và tổng |
Giá gốc: cheese 120k, veggie 110k, clam 150k. Chicago cộng 20k mỗi pizza vì đế dày.
NY cheese + ExtraCheese + Olive -> "NY Cheese Pizza, thêm phô mai, ô liu" = 145000
Chicago clam + Bacon -> 190000
Hóa đơn 2 món trên -> tổng 335000
Bài 3: Mở rộng và kiểm chứng (nâng cao)
Thực hiện 3 thay đổi, mỗi thay đổi 1 commit, ghi git diff --stat vào README.md:
- Thêm vùng California (xưởng nguyên liệu và chi nhánh mới).
- Thêm topping
Pineapple+8k. - Thêm khuyến mãi "mua 2 giảm 10%" vào
Orderbằng StrategyDiscountPolicy.
Viết test tích hợp: đặt 5 đơn ở 3 vùng với topping khác nhau, kiểm tra nguyên liệu đúng vùng, giá đúng, tổng hóa đơn đúng.
✅ Tiêu chí hoàn thành
- Test mẫu giá pass.
- Không pizza nào lẫn nguyên liệu vùng khác (có test).
- 3 thay đổi Bài 3 chỉ thêm file mới hoặc sửa đúng 1 chỗ đăng ký.
- Sơ đồ lớp đánh dấu 3 pattern: Factory Method, Abstract Factory, Decorator.
❓ Câu hỏi ôn tập
- Ai định nghĩa khâu tạo pizza?
- Xưởng vùng đảm bảo gì?
- Topping cộng giá thế nào?
- Thêm topping có sửa pizza không?
🌕 Bạn đã hoàn thành ngày 117. Làm hết bài tập phía trên rồi sang ngày tiếp theo.