پترن Factory Method یکی از الگوهای مهم در دستهبندی الگوهای تولیدی (Creational Patterns) است. هدف اصلی این پترن این است که فرآیند ایجاد اشیاء را از منطق اصلی برنامه جدا کند و به ما اجازه دهد که انواع مختلفی از اشیاء را بدون تغییر در کدهای موجود تولید کنیم. این پترن زمانی مفید است که بخواهیم کد ما انعطافپذیرتر و قابل گسترش باشد.
در بسیاری از برنامهها، نیاز داریم که اشیاء مختلفی از یک کلاس یا اینترفیس پایه تولید کنیم. اگر منطق ایجاد این اشیاء در قسمتهای مختلف برنامه تکرار شود، این موضوع نه تنها باعث پیچیدگی و وابستگی کدها میشود، بلکه نگهداری و گسترش آنها را نیز دشوارتر میکند. در اینجا پترن Factory Method به کمک ما میآید.
ویژگیهای اصلی:
- جدا کردن فرآیند ایجاد شیء از منطق اصلی برنامه
- ایجاد اشیاء به صورت پویا و بدون وابستگی مستقیم به کلاسهای خاص
- افزایش قابلیت گسترش و انعطافپذیری
- کاهش وابستگی بین کلاسها، که باعث بهبود معماری کلی سیستم میشود
ساختار پترن Factory Method:
این پترن شامل یک کلاس پایه یا اینترفیس است که مشخص میکند تمام کلاسهای قابل تولید باید از آن پیروی کنند. سپس یک کلاس یا متد خاص (Factory) ایجاد میشود که مسئولیت تولید این اشیاء را بر عهده دارد. این متد یا کلاس میتواند بر اساس ورودیهای مختلف، نوع خاصی از شیء را تولید کند.
مزایا:
- قابلیت گسترش: با استفاده از این پترن، میتوانید به راحتی کلاسهای جدیدی اضافه کنید بدون اینکه نیازی به تغییر کدهای قبلی باشد.
- انعطافپذیری: این پترن امکان تولید انواع مختلف اشیاء را بدون تغییر در منطق اصلی برنامه فراهم میکند.
- کاهش وابستگی: کلاسها به جای وابستگی مستقیم به یکدیگر، از طریق اینترفیسها با هم در تعامل هستند.
معایب:
- پیچیدگی: استفاده از این پترن ممکن است باعث افزایش پیچیدگی اولیه کد شود.
- نیاز به مستندسازی: اگر تیم توسعه از این پترن استفاده کند، لازم است مستندات کافی برای درک فرآیند تولید ارائه شود.
مثال عملی:
فرض کنید میخواهید برنامهای ایجاد کنید که بسته به نوع درخواستی، محصولی خاص را تولید کند. در اینجا میتوانید از پترن Factory Method استفاده کنید. به مثال زیر توجه کنید:
interface Product {
public function getType();
}
class ConcreteProductA implements Product {
public function getType() {
return "Product A";
}
}
class ConcreteProductB implements Product {
public function getType() {
return "Product B";
}
}
class Factory {
public static function createProduct($type) {
switch ($type) {
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
default:
throw new Exception("Invalid product type");
}
}
}
// استفاده از Factory
$productA = Factory::createProduct("A");
echo $productA->getType(); // خروجی: Product A
در این مثال، کلاس Factory مسئولیت ایجاد محصولات مختلف را بر اساس نوع درخواست شده بر عهده دارد. به این ترتیب، کد مشتری (Client Code) نیازی به تغییر ندارد و فقط کافی است نوع محصول مورد نظر خود را مشخص کند.
جمعبندی:
پترن Factory Method یکی از ابزارهای مهم برای مدیریت فرآیند تولید اشیاء در برنامههای پیچیده است. این پترن با جدا کردن منطق تولید از کد اصلی برنامه، نه تنها قابلیت نگهداری کد را افزایش میدهد بلکه باعث کاهش وابستگی بین بخشهای مختلف میشود. اگرچه ممکن است در ابتدا پیچیده به نظر برسد، اما در پروژههای بزرگ و بلندمدت مزایای بسیاری به همراه دارد.