-
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.
-
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 A
và B
.
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 A
và B
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.