CodeShot

Factory Method در مقابل Abstract Factory

Factory Method یک متد است که در کلاس‌های فرزند Override می‌شود تا نحوه ساخت یک نوع محصول خاص را تعیین کند، در حالی که Abstract Factory یک Interface کامل است که خانواده‌ای از محصولات مرتبط را بدون مشخص کردن کلاس دقیق آن‌ها تولید می‌کند و معمولاً از چند Factory Method در کنار هم تشکیل شده است.

ویژگیFactory MethodAbstract Factory
نوع سازهیک متدیک Interface کامل
تعداد محصول تولیدییک نوعخانواده‌ای از محصولات مرتبط
پیچیدگیکمبیشتر

کِی از Factory Method استفاده کنیم؟

وقتی فقط یک نوع محصول دارید و می‌خواهید نحوه ساخت آن را در کلاس فرزند قابل تغییر کنید.

کِی از Abstract Factory استفاده کنیم؟

وقتی باید خانواده‌ای از محصولات مرتبط و سازگار با هم (مثل دکمه و چک‌باکس هم‌سبک) را بدون وابستگی به کلاس دقیق آن‌ها بسازید.

مثال Factory Method

abstract class Dialog
{
    public abstract Button CreateButton(); // Factory Method
}
class WindowsDialog : Dialog
{
    public override Button CreateButton() => new WindowsButton();
}

مثال Abstract Factory

interface IUIFactory
{
    Button CreateButton();
    Checkbox CreateCheckbox();
}
class WindowsUIFactory : IUIFactory
{
    public Button CreateButton() => new WindowsButton();
    public Checkbox CreateCheckbox() => new WindowsCheckbox();
}

اشتباه رایج

اشتباه رایج استفاده از Abstract Factory پیچیده برای ساخت فقط یک نوع محصول ساده است؛ در چنین حالتی یک Factory Method ساده کافی است و اضافه‌کردن یک Interface کامل با چند متد فقط پیچیدگی غیرضروری اضافه می‌کند.

جمع‌بندی

برای ساخت یک نوع محصول با منطق قابل تغییر در فرزندان از Factory Method و برای ساخت خانواده‌ای از محصولات مرتبط و سازگار از Abstract Factory استفاده کنید.