این الگو یک روش استاندارد برای ایجاد اشیا ارائه میدهد، بدون اینکه کلاس دقیق شیء را مستقیماً مشخص کنیم. بهعبارت دیگر، به جای اینکه از new ClassName()
استفاده کنیم، یک متد مخصوص (Factory Method) داریم که مسئول ایجاد و بازگرداندن نمونهی مناسب است.
✅ کاهش وابستگی (Decoupling) → کنترلرها و بخشهای مختلف سیستم وابسته به کلاسهای خاص نمیشوند. ✅ انعطافپذیری بیشتر → بهراحتی میتوان کلاسهای جدید را بدون تغییر در کد اصلی اضافه کرد. ✅ کد تمیزتر و سازمانیافتهتر → مسئولیت ساخت اشیا در یک مکان مشخص مدیریت میشود.
فرض کنید چندین نوع پرداخت داریم و میخواهیم یک متد برای ایجاد شیء پرداخت مناسب داشته باشیم:
class PaymentController { public function pay($type) { if ($type === 'paypal') { $payment = new PayPalPayment(); } elseif ($type === 'stripe') { $payment = new StripePayment(); } $payment->process(); } }
🔴 این روش باعث میشود که کنترلر وابسته به کلاسهای مختلف باشد، که نگهداری آن را سخت میکند.
class PaymentFactory { public static function create($type) { return match ($type) { 'stripe' => new StripePyment(), default => throw new Exception('نوع پرداخت نامعتبر است.'), }; } } // استفاده در کنترلر class PaymentController { public function pay($type) { $payment = PaymentFactory::create($type); $payment->process(); } }
الگوی Factory Method زمانی مفید است که بخواهید نمونههایی از کلاسهای مختلف را بدون مشخص کردن مستقیم آنها ایجاد کنید. این الگو بهخصوص در سیستمهایی که نیاز به تغییرپذیری و توسعهپذیری دارند، بسیار کاربردی است.