درود دوستان! توی این قسمت می‌خوایم الگوی طراحی Abstract Factory رو بررسی کنیم که نسبتاً پراستفاده هست و پیاده‌سازی راحتی داره.

 

با مثال شروع کنیم

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

function testProducts() {
  const tablet = new AppleTablet();
  tablet.switchOn();
  tablet.ring();

  const watch = new AppleWatch();
  watch.switchOn();
}

مثل همیشه وقتی در ابتدای کار هستیم همه چیز خوب به نظر می‌رسه. حالا با پیشرفت کردن کارخونه، می‌خوایم با یه شرکت دیگه هم (سامسونگ) همکاری کنیم. کد بالا رو باید به این صورت بنویسیم:

function testProducts(company) {
  if (company === 'Apple') {
    const tablet = new AppleTablet();
    tablet.switchOn();
    tablet.ring();
    
    const watch = new AppleWatch();
    watch.switchOn();
  } else if (company === 'Samsung') {
    const tablet = new SamsungTablet();
    tablet.turnOn();
    tablet.startRinging();
    
    const watch = new SamsungWatch();
    watch.turnOn();
  }
}

همونطور که می‌بینیم کدِ ما داره شلوغ‌تر و توسعهٔ اون سخت‌تر میشه. یکی از معایب این کد اینه که مثلاً تبلت‌های اپل با متد switchOn روشن میشن و تبلت‌های سامسونگ با متد turnOn. یعنی هر کدوم پیاده‌سازی‌های متفاوتی دارن و کسی که از این کدها استفاده می‌کنه باید از نحوه پیاده‌سازی محصولات آگاهی داشته باشه. مشکل زمانی بزرگ‌تر میشه که بخوایم با محصولات یه شرکت دیگه هم کار کنیم 🙈

اینجاست که الگوی Abstract Factory به کار ما میاد. اگه این الگو رو پیاده‌سازی کنیم، می‌تونیم بی‌نهایت محصول از شرکت‌های مختلف داشته باشیم، بدون توجه به اینکه نحوه پیاده‌سازی و استفاده از اونها به چه صورت هست 👌

قبل از اینکه با این الگو آشنا بشیم باید بدونیم که مفهوم Client چی هست. Client به قسمتی از برنامه گفته میشه که کار اصلی رو انجام میده. توی مثال بالا، تابع testProducts قسمت Client هست که با کلاس‌هایی که ساختیم در ارتباطه و از اونها نمونه‌سازی می‌کنه تا کاری که مد نظرمون هست (تست فنی محصولات) رو اجرا کنه.

 

الگوی Abstract Factory چیه؟

این الگو این امکان رو به Client میده تا بدون اینکه درگیر نوع آبجکت‌ها و نحوه پیاده‌سازی اونها بشه، وظیفه اصلی خودش رو انجام بده.

قبلاً توی قسمت Client برنامه، ما به صورت دستی آبجکت‌ها رو می‌ساختیم که مشکلات خاص خودش رو داشت. با اعمال کردن این الگو می‌تونیم کاری کنیم که ساختن و پیاده‌سازی آبجکت‌ها از دید Client مخفی بمونه. بعد از اعمال کردن این الگو، تابع به شکل زیر در میاد: