الگوی طراحی abstract factory در جاوا اسکریپت

الگوی طراحی abstract factory در جاوا اسکریپت نوشته شده در   javascript 1 فوریه , 2019 توسط  عباس حسینی

آیا تا به حال شده به عنوان یک برنامه نویس نرم افزاری که توسعه میدهید برای دو سیستم عامل مختلف قابل استفاده بوده باشد؟ اگر این کار را انجام دادید پس بدون آنکه بدانید از الگوی طراحی abstract factory استفاده کردید

اگر میخواهید رابطه الگوی abstract factory با تولید نرم افزار برای سیستم های مختلف را بفهمید این مطلب را تا انتها مطالعه کنید

تعریف الگوی طراحی abstract factory در جاوا اسکریپت

در گذشته مطلبی در مورد الگوی طراحی factory method منتشر کردم که برای آسان شدن فرآیند ساخت شی از آن استفاده میکردیم خب مسئله ای که این الگو داشت این بود که باید مستقیما سازنده شی های مورد نظر را داخل factory استفاده میکردیم که خب هنگام پیچیده شدن مسئله پاسخگوی نیازهای ما نیست

مثلا فرض کنید که قرار است بر اساس نوع سیستم عامل دو نوع ویندوز و مک یک factory داشته باشیم و از طرفی هر کدام از این سیستم عامل ها خود دارای ورژن های مختلفی میباشد

در این شرایط ما مجبوریم با استفاده از الگوی factory method به جای دو حالت، چندین حالت مختلف را داخل یک factory method پیاده سازی کنیم
مشکلی که این مسئله دارد این است که علاوه بر پیچیده شدن factory هر بار که نیاز جدیدی پیش بیاید باید در آن تغییر ایجاد کرده و اصل ocp را نقص کنیم بنابراین الگوی طراحی abstract factory به میدان آمده و با ارائه یک روش راه حلی برای مشکل ما ارائه میکند

الگوی طراحی abstract factory

اگر به شکل بالا توجه کنید خود abstract factory شامل مجموعه ای از fatory های دیگر است که پیاده سازی های مختص به خود را دارند

نحوه پیاده سازی الگوی طراحی abstract factory در جاو اسکریپت

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


class WinFactory {
  createButton(){
    return new WinButton()
  }
} 

class MacFactory {
   createButton(){
    return new MacButton()
  } 
}

از آنجاییکه هر کدام از این سیستم ها بخش های مختلفی را دارد که داخل factory باید پیاده سازی مربوط به آن موجود باشد ولی من اینجا برای سادگی کار فقط میخواهم یک دکمه از نرم افزار را تولید کنم پس دو کلاس WindowsButton و MacButton را تشکیل میدهیم


class WinButton {
  render (){
    return ``
  }
} 
class MacButton {
  render (){
    return ``
  } 
} 

در انتها نوبت به abstract factory میرسد پس کلاس Application را تشکیل داده و به صورت شرطی داخل آن تعیین میکنیم که چه موقع باید از کدام کلاس factory بهره ببرد


//Abstract factory
class Application {
  constructor (os) {
    if (os == "windows") 
       this.factory = new WinFactory()
    else if (os == "mac")
       this.factory = new MacFactory()
  }
  createUi (){
    var button  = this.factory.createButton();
    
    return button.render();
  }
}

بعد از پیاده سازی این الگو در ادامه میتوانید نتیجه اجرای آن را ببیندی که چطور به طور جداگانه دو دکمه مربوط به سیستم عامل ویندوز و مک را تولید کردیم

See the Pen
Javascript Abstract Factory Pattern
by abbas hosseini (@abizebel)
on CodePen.

موارد استفاده از الگوی abstract factory در جاوا اسکریپت

زمانی از این الگو استفاده میکنیم که قصد تولید انوع مختلفی از یک شی را داریم که خود میتواند حالت های مختلفی داشته باشد در این هنگام میتوان با استفاده از الگوی طراحی abstract factory اصل ocp را بخوبی رعالت کرد

لیست الگوهای طراحی GOF در جاو اسکریپت

 

Creational Patterns

 

Structural Patterns

 

Behavioral Patterns