Vấn đề: khi code tạo đối tượng bằng new ConcreteClass() rải rác, nó bị gắn chặt vào lớp cụ thể → muốn đổi/ thêm loại phải sửa nhiều nơi.
- Factory Method: định nghĩa một phương thức tạo đối tượng, để lớp con quyết định tạo loại cụ thể nào. Code gọi làm việc với interface/abstract type, không biết lớp cụ thể → dễ mở rộng (thêm loại mới chỉ cần thêm factory con), tuân Open/Closed và Dependency Inversion.
- Abstract Factory: tạo cả một họ đối tượng liên quan (ví dụ
Button+Checkboxtheo cùng một theme) mà không ràng vào lớp cụ thể, đảm bảo các sản phẩm đi cùng nhau nhất quán.
Lợi ích chung: tách việc tạo đối tượng khỏi việc dùng nó, tập trung logic khởi tạo về một chỗ, giảm coupling. Đánh đổi: thêm số lượng lớp/độ gián tiếp.