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

الگوی طراحی flyweight در جاوا اسکریپت نوشته شده در   javascript 17 ژانویه , 2019 توسط  عباس حسینی

با توجه به پیچیدگی برنامه شما ممکن است استفاده بهینه از حافظه RAM بسیار حائز اهمیت باشد پس هنگام کد نویسی شما باید دقت کنید که بهینه ترین روش های استفاده از حافظه را بکار بگیرید و الگوی طراحی flyweight به شما در انجام این کار بسیار کمک میکند که در ادامه به طور کامل به آن خواهیم پرداخت .

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

الگوی طراحی flyweight راه حلی برای بهینه سازی مصرف حافظه به ما ارائه میدهد، تا با مدیریت بهتر اشیا از حافظه به شکل کمتر و بهینه تر استفاده کنیم تا در پردازش های سنگین با کمبود حافظه مواجه نشویم و این کار با تفیکی استیت ها براحتی امکانپذیر میباشد
در این الگو با دو نوع state مواجه هستیم :
intrinsic state : داده هایی ثابت که توسط اشیای دیگر قابل تغییر نبوده و فقط میتوانند آنها را ببینند که داخل شی flyweight نگهداری میشوند
extrinsic state : داده هایی که توسط اشیای دیگر قابل تغییر هستند و  داخل context نگهداری میشوند

به عبارت دیگر الگوی flyweight به ما میگوید که فقط intrinsic state ها را داخل شی flyweight نگهداری کنیم که بتوانیم از آنها استفاده مجدد کنیم و نتیجه آن کاهش تعداد اشیا و کاهش حافظه مصرفی میباشد و در انتها state های موجود در شی flyweight با extrinsic state های داخل context ترکیب شده و شی کاملی میسازند

اگر به شکل زیر توجه کنید این الگو از سه بخش اصلی زیر تشکیل شده است

client : قراره که flyweight ها را بخوانند
flyweight : شی که قصد داریم فقط instrinsic state ها را داخل آن نگه داریم و بین بقیه اشیا به اشتراک گذاشته شود و با این کار از ساخت نمونه از آن خودداری کنیم
flyweight factory : وظیفه مدیریت flyweight ها را دارد و کلاینت ها به آن درخواست شی میدهند، که اگر موجود داشته باشد بر میگرداند در غیر اینصورت یک شی جدید ساخته و سپس برمیگرداند
context : همه extrinsic state ها داخل آن نگهداری میشوند و وقتی با state های flyweight ترکیب میشه یک شی کامل با همه state را تشکیل میدهد

الگوی طراحی flyweight pattern

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

برای پیاده سازی این الگو من قصد دارم از مثال تاب استفاده کنم ، فرض کنیم یک کلاس Book به شکل زیر داریم


class Book {
  constructor (name, author, isbn, availibility, sales){
    this.name = name;
    this.author= author;
    this.isbn = isbn;
    this.availibility = availibility;
    this.sales = sales;
  }
}

اگر تعداد کتاب های منتشر شده بسیار زیاد باشد با توجه به این ویژگی های زیاد تولید شی های زیاد از این کتاب، حافظه زیادی را از ما اشغال میکند بنابراین داده های extrinsic باید از آن جدا شوند

خب در اینجا نام نویسنده و نام کتاب و کد بین المللی کتاب جز داده های اصلی هستند که میتوانند همه کتاب ها داشته باشند پس instrinsic state های ما هستند و میزان فروش و در بازار و موجود بودن کتاب که اطلاعات فرعی هستند، جزو extrinsic state های ما هستند

پس شروع به استفاده از الگوی flyweight میکنیم ابتدا داده های extrinsic را از کلاس Book حذف میکنیم و یک کلاس سبک به نام FlyweightBook میسازیم


class FlyweightBook {
  constructor (name, author, isbn){
    this.name = name;
    this.author= author;
    this.isbn = isbn;
  }
}

سپس نیاز به یک کلاس به نام BookFactory داریم که وظیفه ساخت اشیای سبک flyweight را دارد و شامل دو متد یکی برای ساخت شی flyweight و دیگری شمارش تعداد آنها را دارد

دقت کنید که BookFactory فقط اشیایی که دارای instrinsic state هستند را تولید میکند و اگر از قبل موجود باشد آنها را برمیگرداند در غیر اینصورت یک نمونه جدید از آن میسازد



class BookFactory {
  constructor() {
    this.count = 0;
    this.flyweightBooks = {}

  }
  createBook(name, author, isbn) {
    var book = this.flyweightBooks[isbn];
    if (book) {
      return book;
    } else {
      var book = new FlyweightBook(name, author, isbn);
      this.flyweightBooks[isbn] = book;
      return book;
    }
  }
  getCount() {
    var count = 0;
    for (var f in this.flyweightBooks) count++;
    return count;
  }
}

در ادامه یک کلاس به نام BookContext را داریم که وظیفه نگهداری exstrinsic state ها را دارد و یک متد برای افزودن و یکی برای شمارش کل کتاب ها را دارد


class BookContext {
  constructor(bookFactory) {
    this.count = 0;
    this.bookFactory = bookFactory;
    this.bookList = {}
  }

  add(name, author, isbn, availibility, sales) {
    var book = this.bookFactory.createBook(name, author, isbn);
    book.sales = sales;
    book.availibility = availibility;
    
    this.bookList[isbn] = book;
    this.count++;
  }
  getCount() {
    return this.count;
  }
}

دقت کنید که که بعد از استفاده از این الگو مشاهده خواهید کرد که کلاینت با استفاده از BookFactory اشیای flyweight را ساخته و وقتی این اشیای flyweight با اشیای موجود در context ترکیب میشوند شی کامل با همه state ها را تولید میکند که میتوانید نتیجه آن را در ادامه ببینید

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

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

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

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

 

Creational Patterns

 

Structural Patterns

 

Behavioral Patterns