SaigonTech Vault
Loại: knowledge-doc 2026-09-29 active #wiki-import

Abstract Factory thuộc nhóm creational (nhóm khởi tạo đối tượng). Nó cho phép bạn tạo ra các nhóm đối tượng có liên quan với nhau mà không cần chỉ định các class cụ thể của chúng.

Vấn đề

Hãy tưởng tượng rằng bạn đang tạo một chương trình mô phỏng cửa hàng đồ nội thất. Souce code của bạn bao gồm các class đại diện như sau:

  • Một nhóm các sản phẩm liên quan, đi kèm với nhau
    VD: Chair + Sofa + CoffeeTable

  • Một số variants của nhóm này.
    VD: Modern, Victorian, ArtDeco,... Nhóm sản phẩm và một số loại của chúng.

Các sản phẩm lẻ nên khớp với thuộc tính của nhóm sản phẩm. Khách hàng sẽ khá tức giận khi nhận được sản phẩm trông lạc quẻ so với nhóm.

link

Ngoài ra, bên sản xuất update sản phẩm thường xuyên, nên hãy làm sao để không phải đổi source code lõi mỗi khi có update.

Giải pháp

Rất may, Abstract Factory Pattern chính là chiếc phao có thể giải nguy cho bạn trong trường hợp này.

Điều đầu tiên mà Abstract Factory Pattern đề xuất chính là khai báo từng interface cho từng sản phẩm riêng biệt trong một nhóm sản phẩm (ví dụ: Chair, Sofa, CoffeeTable, …).

Sau đó, mỗi loại biến thể của từng sản phẩm riêng biệt sẽ phải tiến hành implements interface đó.

VD: tất cả các loại biến thể của Chair phải tiến hành implements interface Chair, tất cả các loại biến thể của Sofa phải tiến hành implements interface Sofa, …

The Chairs class hierarchy

Tiếp theo cần khai báo một Abstract Factory – một interface bao gồm các factory method cho từng sản phẩm riêng biệt trong một nhóm sản phẩm
(vd: createdChair, createdSofa và createdCoffeeTable, …).

Mỗi factory method này sẽ trả về kiểu dữ liệu ứng với loại interface đã được khai báo của nó (ví dụ: Chair, Sofa, CoffeeTable, …)

The _Factories_ class hierarchy

Vậy còn nhóm các sản phẩm ứng với mỗi variants thì sao? Nên tạo ra các factory riêng biệt dựa trên interface AbstractFactory đã được khai báo, mỗi factory này sẽ lần lượt implement các factory method của AbstractFactory interface và trả về tất cả các sản phẩm của một nhóm cụ thể.

Ví dụ: ModernFactory chỉ có thể tạo các đối tượng ModernChair, ModernSofa và ModernCoffeeTable.

Giờ đây khi cần nhóm sản phẩm thuộc variants nào đó, phía khách hàng chỉ cần chỉ ra factory tương ứng là đã có thể nhận được đúng sản phẩm đảm bảo đúng nhóm.

Cấu trúc

Abstract Factory design pattern

  • Abstract Products: Khai báo dạng interface hoặc abstract class cho các loại sản phẩm khác nhau.

  • Concrete Products: Các sản phẩm cụ thể của Abstract Products.

  • Abstract Factory: Khai báo dạng interface hoặc abstract class chứa tập hợp các phương thức tạo các Abstract Products.

  • Concrete Factories: Các Factory cụ thể của Abstract Factory. Chỉ định rõ các loại sản phẩm sẽ được tạo ra.

  • Client: Nơi sử dụng AbstractFactory và các AbstractProduct.

Ưu điểm

  • Chắc chắn sản phẩm nhận được từ cùng một nhà máy sẽ tương thích với nhau

  • Single Responsibility Principle: có thể di chuyển mã tạo sản phẩm vào một nơi trong chương trình, giúp mã hỗ trợ dễ dàng hơn.

  • Open/Closed Principle: có thể giới thiệu các loại sản phẩm mới vào chương trình mà không cần đổi client code hiện có.

Nhược điểm

Code có thể trở nên phức tạp hơn vì rất nhiều interface và class mới được giới thiệu cùng với mẫu.

Refer

Nguồn: https://refactoring.guru/design-patterns/abstract-factory

Ví dụ bằng PHP: https://refactoring.guru/design-patterns/abstract-factory/php/example