Thắc mắc về abstract factory vs factory method pattern

mình mới đọc qua về 2 pattern này thấy nó rất giống nhau, nên mình có thắc mắc muốn hỏi

factory method

structure

abstract factory

như mình thấy trên uml thì thằng factory method và thằng abstract đều có cấu trúc gần như nhau, chỉ có cái khác là thằng abstract factory thì có nhiều method create hơn, phải ko nhỉ, nếu như vậy mình có thể nói là thằng abstract factory là thằng factory method mà có nhiều method create đc ko?

  1. Về mặt design pattern, cả hai đều gọi chung là factory pattern, chứ không phân ra thêm abstract và non-abstract.

  2. Không thể gọi abstract factory là thằng factory method có nhiều method create.

AbstractFactory được gọi là abstract vì có định nghĩa một kiểu dữ liệu trừu tượng interface AbstractFactory, để từ đó tạo ra nhiều implementation khác nhau (ConcreteFactory1, ConcreteFactory2) để phía Client sử dụng.

Ví dụ:

Bạn có AbstractFactory là một factory tạo ra product là các mặt hàng thực phẩm. Đây chỉ là một factory trên mặt giấy tờ, quy định rằng nó có thể tạo ra hai món ăn AB.

Từ AbstractFactory, bạn tạo ra một factory thực thể (xây dựng nó ngoài đời thực), gọi là VietnamFactory. Factory triển khai 2 hàm createProductA, createProductB như được quy định. Trong phần định nghĩa của hai hàm create đó, bạn cấu hình thành phần của món ăn để phù hợp với khẩu vị của người Việt Nam.

Tiếp theo đó, bạn muốn mở thêm một nhà máy tương tự ở Mỹ để có thể phân phối thực phẩm ở đó. Vì khẩu vị của người Mỹ rất khác người Việt, bạn không thể xây một VietnamFactory khác để bán cho người Mỹ.
Lúc này, bạn mới kế thừa AbstractFactory, xây một AmericaFactory sản xuất hai món ăn AB với công thức dành riêng cho người Mỹ, chẳng hạn như bỏ đi rau mùi, gia vị đậm đà hơn, v.v…

Không lâu sau đó, bạn lên kế hoạch bán sản phẩm của mình sang cho Mexico và Lào. Nhận xét chung, khẩu vị Mexico không khác nhiều so với Mỹ, tương tự với Lào và Việt Nam.
Vì đã có nhà máy tại quốc gia lân cận là Mỹ và Việt Nam, bạn không xây thêm 2 nhà máy, mà tạo ra hai Client, tương ứng với 2 quốc gia đó, và cho sản xuất factory ở quốc gia gần nhất và vận chuyển.

Diễn giải bằng code như sau:

AbstractFactory vietnamFactory = new VietnamFactory();
AbstractFactory americaFactory = new AmericaFactory();
// để ý cả 2 kiểu VietnamFactory, AmericaFactory đều có thể được gán về cùng kiểu cha là AbstractFactory - OOP

Client mexicoClient = new Client(americaFactory);
Client laosClient = new Client(vietnamFactory);

// Khi Lào muốn đặt một sản phẩm
laosClient.factory.createProductA(); // món ăn A theo khẩu vị người Việt được xuất khẩu đến Lào

// Một ngày đẹp trời, Lào đổi khẩu vị.
laosClient.factory = americaFactory;
laosClient.factory.createProductA(); // món ăn A theo khẩu vị người Mỹ được xuất khẩu đến Lào

Đây không hẳn là câu hỏi về design pattern, mà về OOP nhiều hơn.

4 Likes

Cậu sẽ thấy nhiều design pattern có UML na ná nhau, nhưng chúng không giống nhau đâu :smile:

Để tớ giải thích cho cậu abstract factory được dùng để làm gì nhé :smile:
Cậu thử tưởng tượng, cậu cần design một hệ thống sản xuất xe ô tô trong một game nào đó.
Mỗi hãng xe đều sản xuất xe có:

  • Bánh xe
  • Cửa xe
  • Động cơ
  • Vô lăng
  • Cửa kính

Giờ, khi cậu cần tạo ra một cái bánh xe, cậu có thể sử dụng factory method để làm điều đó. Tương tự với các thành phần khác.
Cơ mà, cậu có thể thấy, cậu cần rất nhiều factory method cho từng hãng xe, và cho từng thành phần. Cậu cũng luôn phải để ý context, vì chắc chắn bánh xe của xe Toyota không thể lắp cho một xe Lamborghini được :sweat_smile:
“Ohm, thế thì sao mình không tạo ra cả nhà máy cho từng hãng xe, nhà máy đó sẽ sản xuất toàn bộ tất cả các thành phần của xe. Khi ấy, chỉ cần đổi nhà máy, thì toàn bộ các sản phẩm sẽ được thay đổi một cách đồng bộ?”


Đó là abstract factory :smile:
Cậu có thể thấy, khi cậu cần tạo ra một set các sản phẩm (toàn bộ kit của UI Widget cho iOS/Android, toàn bộ các chi tiết cho một dòng sản phẩm nhất định, etc), cậu nên sử dụng abstract factory.

Miễn là cậu hiểu vấn đề mà abstract factory giải quyết, khi mà factory method khó có thể đạt được mà không tốn nhiều effort, là được :smile: (tớ nghĩ sau khi cậu hiểu, cậu sẽ không gọi abstract factory là factory method có nhiều method create đâu :smile:)

Hope it helps!

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