Factory Method giải quyết một loại object: bạn có một hàm/method quyết định tạo instance nào dựa trên input, phần code gọi chỉ thấy interface.
ts
function createStorage(cfg: Config): Storage {
switch (cfg.driver) {
case 's3': return new S3Storage(cfg.s3)
case 'local': return new LocalStorage(cfg.path)
}
}Abstract Factory giải quyết một nhóm object phải khớp nhau.
Ví dụ chọn nhà thanh toán: mỗi nhà có client tạo giao dịch, verifier chữ ký webhook và refunder riêng — trộn client của A với verifier của B là sai.
ts
interface PaymentProvider {
createCharge(): ChargeClient
createWebhookVerifier(): WebhookVerifier
}
// SepayProvider và StripeProvider mỗi bên trả về bộ khớp nhauQuy tắc chọn: một sản phẩm → Factory Method. Một họ sản phẩm cần đồng bộ, không được lắp lẫn → Abstract Factory.
Thực tế: đa số ứng dụng chỉ cần một hàm factory đơn giản như trên. Chỉ dựng cả interface factory khi đã có từ 2 nhà cung cấp thật sự cùng chạy, không phải vì "sau này biết đâu cần".