پرش به محتوا

دیزاین پترن Simple Factory در PHP

سلام، بعد از یه وقفه ی نسبتا طولانی امروز دوباره تصمیم گرفتم که این وبلاگ متروکه رو آپدیت کنم و یسری پست که احساس میکنم خوبن رو اینجا بفرستم… البته پستای قبلیمو دارم میبینم اکثرا چرت و پرتن و ارزش خوندن ندارن ولی به هر حال وبلاگ خودمه و کلی پول هاست و دامین دادم و دوس دارم که بعنوان یادگاری همینجا باشن و کسی اگه اعتراض داره میتونه مراتب اعتراضش رو تحت یک کامنت برام ارسال کنه تا بررسی و پاسخ داده بشه 🙂

Design patternها یا فارسیش میشه احتمالا الگوهای طراحی نرم افزار توی همه زبان ها خیلی خیلی مهمن. معمولا وقتی کدی مینویسیم که قرار نیست در آینده گسترش داده بشه خیالمون راحته و از یجای کار شروع میکنیم و یجا تموم میکنیم و کار رو تحویل میدیم، ولی وقتی کارفرما میگه که “در آینده قراره امکانات زیادی از قبیل فلان۱ و فلان۲ و… به سیستم اضافه بشه”، اونجا باید یه فکر پایه ای تر برای سیستم داشته باشیم. طوری که اگه قرار شد یه بخش جدید رو به سیستم اضافه کنیم مجبور نباشیم تو بخشای قبلی دست اندازی کنیم یا حداقل کم مجبور باشیم(!).

فرض کنید که میخواید یه فروشگاه بنویسید که ادمین روزی چند تا محصول از نوع اسباب بازی به سیستم اضافه میکنه. ابتدایی ترین روشی که به فکر همه ما میرسه اینه که یه کلاس ایجاد کنیم تحت نام Product  و توی اون درج، اصلاح، حذف و … محصول که فعلا اسباب بازی هست رو انجام بدیم. یه چیزی شبیه این :

<?php
class Product {
    public function __construct($name) {}

    public function save() {}
}
$product = new Product('first toy');
$product->save();

تا اینجا همه چی خوبه و شما در آرامش قبل از طوفان به سر میبرید! مشکل زمانی پیش میاد که مجبور بشید مثلا بجز اسباب بازی ، کتاب هم در فروشگاهتون بفروشید. اینجا دیگه روش ایجاد و اصلاح و … فرق میکنه و نمیتونید همین متد های قبل رو استفاده کنید. توی دیزاین پترن بالا شما مجبورید یه $type  زمان نمونه گیری از کلاس بگیرید و توی هر متد if و else بذارید و بگید اگه این دسته بود این کارو بکن و اگه… که قطعا روش خوبی نیست و مثلا وقتی چنتا دسته دیگه بعدها اضافه بشه کدمون خیلی داغون میشه.

نحوه ی پیاده سازی دیزاین پترن Simple Factory در PHP

سیمپل فکتوری دیزاین پترن میگه که شما این کارو بکنید :

اول یه کلاس factory بسازید :

class ProductFactory {
  public function __construct(){ }

  public static function create($type){
     if ($type == '')
        throw new Exception('invalid product type');
     else {
        $className = 'product_' . ucfirst($type);
        if (class_exists($className))
           return new $className;
        else
           throw new Exception('Product type not found');
     }
  }
}

حالا واسه ساخت اسباب بازی از روش خیلی ساده زیر استفاده کنید :  

class product_Toy
{
  public function __construct(){
     echo "toy is creating";
  }
}
$toy = ProductFactory::create('toy');

حالا اگه یه دسته جدید مثل کتاب به محصولاتون اضافه شه خیلی راحت میتونید کلاسش رو بسازید محصولتون رو اضافه کنید :

class product_Book
{
  public function __construct(){
     echo "book is creating";
  }
}
$book = ProductFactory::create('book');

در مجموع simple factory method خیلی ایده ی سختی نداره. میگه وقتی داری از یه کلاس نمونه میگیری که خودش میتونه انواع مختلفی داشته باشه یدونه فکتوری واسش درست کن و از فکتوری نمونه بگیر که هر بار مجبور نشی هزار تا جایی که ازش نمونه گرفتی رو تغییر بدی. بعد برو توی فکتوری و چک کن که با توجه به کانفیگت کدوم کلاس رو نمونه بگیری.

احتمالا الان میگید که این که خیلی پیش پا افتاده بود و شاید شما خیلی کارای خفن تر هم میتونید انجام بدید ولی خب بعضی وقتا همین کارای ساده باعث منظم شدن برنامه میشن و در آینده خودتون و مخصوصا دیگران کمتر اذیت میشن. البته این دیزاین پترن همونطور که از اسمش مشخصه سیمپل بود و  در آینده در مورد پترن های دیگه هم صحبت خواهیم کرد حتما

امیدوارم کمکتون کرده باشم و خوشحال میشم نظراتتون رو بشنوم 🙂

5 دیدگاه دربارهٔ «دیزاین پترن Simple Factory در PHP»

  1. نوشته ها هر چی که باشن بهتر از ننوشته شده هاست

    این مطلبتون فوق العاده بود.
    خیلی خوب و ساده تنوسته بودید منظورتون رو برسونید
    موفق باشید

    فقط ای کاش دیگر الگوها را هم می توانستید به همین روش آموزش بدید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *