Nên áp dụng design patterns nào?

Chào mọi người
Việc là trong lúc học về design pattern em được ra một vấn đề, mà không biết nên áp dụng mẫu design nào thì hợp lý nhất nên đăng lên hỏi mọi người:

Đề bài:

Một cửa hàng bán bánh mì, có bán nhiều loại bánh mì khác nhau, khi khách hàng đi vào cửa hàng, chủ tiệm đưa menu trình bày tất cả các món bánh mì mà cửa hàng cung cấp, sau khi nhận được đặt hàng từ khách hàng thì người chủ đưa đơn đặt hàng vào 1 máy cho nó tự động sản xuất ra bánh mì tương ứng với đơn đặt hàng: với mọi nhiên liệu khác nhau thì máy đưa ra cho chúng ta 1 loại bánh mì tương ứng.

Ví dụ: Nhiên liệu là sữa và bột thì ta có loại bánh mì thường, sữa bột và phô mai thì ta có được bánh mì phô mai,… Hiện tại cửa hàng cung cấp các loại bánh mì như sau:

  • Bánh mì thường: bột, sữa
  • Bánh mì phô mai: bột, sữa phô mai
  • Bánh mì thịt: bột, sữa, thịt nguội

Hãy áp dụng 1 trong các mẫu thiết kế đã tìm hiểu, thiết kế ra các lớp và phương thức cần thiết để có thể sản xuất ra được các loại bánh mì theo yêu cầu của khách hàng. Sau đó viết một số đoạn code áp dụng minh họa sử dụng cấu trúc đã xây dựng.

Vấn đề em gặp phải là việc dù có áp dụng mẫu nào như Method Factory hay Decorator thì cũng đều vướng vô vấn đề là phải có 1 mớ if else hay switch case kiểu nguyên liệu ab c => bánh mình x chẳng hạn, nên mình muốn hỏi thử xem là có phương án nào mà không lạm dụng mấy cái điều kiện rẽ nhánh mà vẫn ra được kết quả như mong muốn không.

Em cảm ơn mọi người đã xem.

merged to the #1 post by noname00

Mình nghĩ dùng Factory pattern
Có 3 class riêng biệt cho 3 loại bánh mì.
BanhMiX (x = 1,2,3) {nhận tham số là nguyên liệu làm, method có makeBread}

Giờ tạo 1 class mới là BreadFactory {tham số là kiểu bánh mì, return về class tương ứng ở trên}
Từ object đc tạo từ Factory trên gọi phương thức makeBread

Hi there,

Tớ nghĩ trước hết cậu cần phân tích bài toán chút.

Phân tích

Trong đề bài có đề cập “máy tạo bánh mì”, vậy cậu sẽ có 2 lựa chọn có thể sử dụng ở đây, đó là Facade hoặc Factory pattern để thực hiện vai trò “đóng gói” toàn bộ chức năng. Tuy nhiên, vì cậu cần tạo object bánh mì. Factory pattern sẽ là ứng cử viên hàng đầu.

Cậu có 3 lựa chọn bánh mì khác nhau, mỗi cái cần 1 loại nguyên liệu khác nhau. Điều đó cho cậu 1 vài lựa chọn để cài đặt việc tạo ra bánh mì, đó là Abstract Factory, Builder patternFactory pattern với các method khác nhau/hoặc switch case trong Factory pattern. Cả 3 cách đều có thể cài đặt được, với các cài đặt khác nhau, nhưng tớ recommend cậu nên sử dụng Abstract Factory với 3 thể hiện khác nhau, tương ứng với việc tạo ra 3 loại bánh, vì pattern này được design cho use case này.

Tiếp theo, vì cậu muốn hạn chế if hay switch case (điều mà tớ rất khuyến khích), mà cậu biết vai trò của swich case hay if là để ánh xạ giữa yêu cầu và chức năng, nên cậu có 2 lựa chọn:

  • dùng 1 map, với key là yêu cầu (tạo bánh mì thịt…), value là chức năng (abstract factory class tương ứng với bánh mì thịt, hoặc 1 strategy để tạo ra bánh mì thịt, cậu có thể lựa chọn một trong 2)
  • hoặc dùng enum với thuộc tính chức năng (thể hiện của abstract factory hay strategy tạo bánh mì, như trên). Enum chính nó đã là key cho cậu rồi. Tớ prefer cách này hơn, vì nó elegant hơn :smile:

Bằng cách đó, cậu sẽ không có câu lệnh if nào trong toàn bộ implement của cậu.

Cài đặt

Tớ đoán cậu sẽ không gặp vấn đề gì với việc cài đặt factory, chắc chỉ phần map (enum) mới gặp vấn đề.
Tớ recommend cậu tham khảo cách implement menu (đoạn menu element, đoạn Application và cách lấy chức năng ở đoạn menu, trong mục Hidden content) ở bài viết này:

Trong phần implement này, tớ không dùng map hay enum, nhưng cậu hoàn toàn có thể hiểu ý tưởng ở đây, và tự implement hoặc sử dụng map, hoặc sử dụng enum cho phù hợp.

Hi vọng chỉ dẫn trên sẽ giúp cậu.

10 Likes

Cảm ơn bạn, mình hiểu ý bạn rồi

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?