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

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âuPatternViệc duy nhất
Tạo pizza vùngFactory MethodChi nhánh tự tạo
Bộ nguyên liệuAbstract FactoryCùng vùng đồng bộ
Cộng toppingDecoratorBọ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ầnPatternYêu cầu
PizzaStore::orderPizza(type)Factory MethodQuy trình chung prepare, bake, cut, box. createPizza để chi nhánh ghi đè
NYPizzaStore, ChicagoPizzaStoreMỗi chi nhánh bán cheese, veggie, clam
PizzaIngredientFactoryAbstract Factory1 xưởng mỗi vùng: bột, sốt, phô mai, rau, nghêu
PizzaKhông biết vùng nào, chỉ hỏi xưởng

Bài 2: Topping và hóa đơn

Thành phầnPatternYêu cầu
PizzaItem (interface có description(), cost())Pizza cài interface này
ToppingDecoratorDecoratorExtraCheese +15k, Olive +10k, Mushroom +12k, Bacon +20k
OrderNhiề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:

  1. Thêm vùng California (xưởng nguyên liệu và chi nhánh mới).
  2. Thêm topping Pineapple +8k.
  3. Thêm khuyến mãi "mua 2 giảm 10%" vào Order bằng Strategy DiscountPolicy.

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.

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.