درود دوستان! توی این قسمت می‌خوایم یک الگوی طراحی ساده و درعین حال پرکاربرد رو بررسی کنیم؛ یعنی Factory Method!

با مثال شروع می‌کنیم: فرض کنیم یک شرکت ارسال کالا داریم که در حال حاضر فقط به صورت موتوری فعالیت می‌کنه. کد زیر رو در نظر بگیرید:

class Delivery {
  public handle() {
    const bike = new Bike();
    bike.setMode('eco');
    bike.move();
  }
}

const init = new Delivery();
init.handle();

توی متد handle ما از کلاس Bike یک نمونه می‌سازیم و بعد کارهای آماده‌سازی ارسال رو انجام می‌دیم. تا اینجا همه چیز خیلی خوب و بدون مشکل پیش میره.

مدتی بعد که شرکت رشد کرد، می‌خوایم یک روش ارسال دیگه اضافه کنیم. این‌بار با اتومبیل. خب برای این‌کار باید متد handle رو مقداری دستکاری کنیم:

class Delivery {
  public handle(mode) {
    if (mode === 'bike') {
      const bike = new Bike();
      bike.setMode('eco');
      bike.move();
    } else if (mode === 'car') {
      const car = new Car();
      car.setColor('green');
      car.move();
    }
  }
}

const init = new Delivery();
init.handle();

همونطور که می‌بینیم متد handle مقداری شلوغ شد. همچنین داره کارهایی رو انجام میده که خارج از وظیفه اون هست؛ مثل ساختن و شخصی‌سازی وسیله نقلیه (اصل اول SOLID ؟!)

خب اگه چند روش ارسال دیگه بخوایم اضافه کنیم چطور؟ مثلاً قطار و هواپیما. می‌تونید تصور کنید که چقدر متد handle شلوغ و کد غیر قابل توسعه میشه؟ (اصل دوم SOLID ؟!) برای حل این مشکل، الگوی Factory Method به کار ما میاد 👌

 

الگوی Factory Method

این الگو میگه به جای اینکه خودمون به صورت مستقیم آبجکت‌ها رو بسازیم، کارِ ساختن آبجکت‌ها رو ببریم توی یک متد دیگه. به این متد میگن Factory که توی کلاس اصلی نوشته میشه.

این الگو زیرمجموعه الگوهای Creational هست: الگوهایی که توی اونها ساختن آبجکت اتفاق می‌افته.

خب برای شروع بیاید مثالی که نوشتیم رو مقداری دستکاری کنیم:

class Delivery {
  public makeVehicle(mode) {
    if (mode === 'bike') {
      const bike = new Bike();
      bike.setMode('eco');
      
      return bike;
    } else if (mode === 'car') {
      const car = new Car();
      car.setColor('green');

      return car;
    }
  }
  
  public handle(mode) {
    const vehicle = this.makeVehicle(mode);
    vehicle.move();
  }
}

const init = new Delivery();
init.handle('bike');

اینجا یک متد ساختیم به اسم makeVehicle که مخصوص ساختن آبجکت‌ها هست. این همون متد Factory هست. توی نگاه اول شاید بگیم که کار بیهوده‌ای انجام دادیم: یه متد ساختیم و فقط کدها رو جابجا کردیم. به هر حال یک متد دیگه مسئول ساختن آبجکت‌ها شد و این الگو یعنی همین.