کاهش مصرف حافظه و بهبود کارایی با الگوی طراحی Flyweight

5 دقیقه زمان مطالعه
1402/10/20
1 نظر

الگوی طراحی Flyweight یک راه حل هوشمندانه برای مدیریت حافظه و بهبود کارایی برنامه‌هاست. در مواجهه با برنامه‌هایی که تعداد زیادی اشیا با اطلاعات مشابه ایجاد می‌کنند، الگوی Flyweight با اشتراک‌گذاری اطلاعات عمومی بین اشیا، به کاهش مصرف حافظه و بهبود عملکرد کمک می‌کند. این الگو از الگوهای Singleton و Factorymethod هم بهره می‌برد تا اشیا به صورت اشتراکی ایجاد شوند و مدیریت بهینه‌تری برای آن‌ها فراهم کند. در این مقاله قصد داریم این الگوی طراحی را بررسی کنیم؛ با ما همراه باشید.

آشنایی با الگوی طراحی Flyweight

هر شی می‌تواند شامل دو دسته اطلاعات باشد:

  1. اطلاعات داخلی (Intrinsic Information): اطلاعاتی که به صورت عمومی بوده و در نمونه‌های مختلفی که از یک کلاس گرفته می‌شود به صورت ثابت هستند؛ مانند اطلاعات شرکت بر روی کارت ویزیت کارکنان که همه مثل هم هستند.
  2. اطلاعات خارجی (Extrinsic Information): اطلاعاتی که به صورت عمومی نیستند و برای هر نمونه این اطلاعات منحصر به‌ فرد هستند؛ مانند نام کارکنان و عنوان آن‌ها بر روی کارت ویزیت که اسم و عنوان برای هریک از کارکنان منحصر به‌فرد است.

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

برای این منظور، ما باید مکانیزمی داشته باشیم که هر شی که به صورت اشتراکی بین اشیا دیگر مورد استفاده قرار می‌گیرد، یک بار بیشتر ایجاد نشود و در ضمن آن‌ها را هم مدیریت کنیم. برای این منظور از الگوهای Singleton و Factorymethod استفاده می‌کنیم. به عنوان مثال تصور كنيد مسئول طراحی يك برنامه هستيم كه قرار است برای هر كارمند يك سازمان، كارت ويزيت چاپ كند که شامل نام و نام خانوادگی کارمند، سمت او و نام شرکت و آدرس باشد. فرض کنیم سازمان مورد نظر، يك سازمان بسيار بزرگ با چند هزار كارمند است.

اولين طراحی كه می‌تواند به ذهن خطور كند، يك طراحی بسيار ساده است. يک كلاس به نام كارت ويزيت تعريف می‌كنيم و صفاتی را كه در كارت قرار دارند، به كلاس منتقل می‌كنيم و يک متد چاپ هم برای چاپ كارت تعريف می‌كنيم. در اين‌ صورت بايد به ازای هر كارمند يک نمونه از كلاس visitCard ايجاد كنیم، يعني بايد چند هزار شی visitCard ايجاد كنیم و اين می‌تواند منابع زیادی از سيستم را مصرف كند.

بیشتر بخوانید: الگوی Facade چیست؟

اما با توجه به ساختار كارت متوجه می‌شویم كه نام شركت و آدرس برای تمام افراد يكی است. در این مورد می‌توانیم از الگوی Flyweight استفاده کنیم و اطلاعات مشترک را در کلاس Flyweight قرار دهیم و زمانی که درخواست یک شی ارسال شد با استفاده از کلاس FlyweightFactory بررسی کنیم که آن شی قبلا ایجاد شده یا خیر، در صورتی که آن شی قبلا موجود باشد همان را برای ما برگرداند و در غیر این‌صورت آن شی را ایجاد کند. در شکل ۱ کلاس دیاگرام مربوط به این الگو نمایش داده شده و در زیر آن شرکت‌کنندگان در آن و نقش هریک بیان شده است.

بنابر گفته GoF هدف از الگوی Flyweight عبارت است از:

«از اشتراک منابع برای فراهم نمودن تعداد زيادی از اشيا سبک به‌ صورت کارا استفاده می‌کند.»

Flyweight Pattern Class Diagram

Flyweight pattern class diagram
شکل ۱: کلاس دیاگرام الگوی Flyweight

نقش کلاس‌ها‌

  • Flyweight: واسطی که شکل کلی اشیای برنامه را تعریف می‌کند.
  • ConcreteFlyweight: پیاده‌سازی Flyweight Interface و ذخیره کردن اطلاعات عمومی.
  • UnsharedConcreteFlyweight: نیازی نیست که تمام زیرکلاس‌های Flyweight به صورت اشتراکی باشند، شی می‌تواند به صورت غیر اشتراکی باشد. فرزندی از یک سطح Flyweight مثل سطری است که می‌تواند همه ستون‌ها را نداشته‌ باشد، البته این مورد استفاده نمی‌شود.
  • FlyweightFactory: ایجاد و مدیریت شی Flyweight زمانی‌که کلاینت درخواست می‌دهد. اگر Flyweight موجود بود، یک نمونه از آن را در اختیار می‌گذارد و اگر موجود نبود یک نمونه از آن ایجاد می‌کند.
  • Client: استفاده از Flyweight.

دیگر ویژگی‌های کلیدی:

در جدول ۱- به صورت خلاصه هدف الگو، نام یا نام‌های دیگری که الگو با آن شناخته می‌شود، مواقعی که می‌توان از این الگو استفاده کرد، نتایج استفاده از این الگو و الگوهای مرتبط به این الگو توضیح داده شده است.

عنوان شرح
نام Flyweight Pattern
هدف استفاده از اشتراک‌گذاری برای پشتیبانی تعداد زیادی اشیا به طور کارامد.
نام‌های دیگر ندارد
کاربرد وقتی از این الگو استفاده کنید که:
  • اشیا بسیار زیادی دارید که داده‌های مشابهی دارند.
  • کاهش حافظه مصرفی برای ما بسیار مهم باشد.
  • اشیا مشترک کم، می‌توانند جایگزین اشیا به اشتراک گذاشته نشده‌ زیاد شوند.
نتایج
  • شی  flyweight، شی‌ای است که استفاده از حافظه را با اشتراک‌گذاری اشیا مشابه، کاهش می‌دهد. این روشی ا‌ست برای استفاده از تعداد بسیار زیادی از اشیا مشابه که نمی‌توان همه‌ی آن‌ها را در حافظه ایجاد کرد و یا هزینه‌ی زیادی در بر دارند.
  • هر شی‌ flyweight دو نوع ویژگی دارد، ویژگی ذاتی و درونی، ویژگی عارضی.
  • هرچه تعداد و حجم کلاس‌ها بیشتر باشد این الگو بهتر می‌تواند خود را نشان دهد.
  • اگر حجم اطلاعات درونی خیلی کم باشد بهتر است از این الگو استفاده نکنیم، چون که زیاد نمی‌تواند مفید باشد.
  • از معایب آن، این است که مشخص نیست چه قسمتی از الگو باید کنترل و مدیریت حالت‌های بیرونی را داشته باشد.
الگوهای مرتبط Composite: بیشتر مواقع الگوی Flyweight به همراه الگوی Composite استفاده می‌شود تا بتوان ساختار سلسله مراتبی از اشیا را نیز به شکل استانداردی تعریف کرد.

معمولا بهتر است، الگوی State و Strategy به صورت Flyweight پیاده‌سازی شود. بدین ترتیب برای نمونه  به تمام اشیایی که به نمونه‌ای از یک Strategy نیاز دارند، تنها یک شی تحویل داده می‌شود.

جدول ۱- : ویژگی‌های Flyweight

سخن پایانی

الگوی Flyweight با ارائه رویکردی جدید در مدیریت اشیا، به بهبود کارایی و بهینه‌سازی مصرف حافظه در برنامه‌ها کمک می‌کند. با استفاده از این الگو، اطلاعات عمومی به یک کلاس به نام Flyweight منتقل می‌شوند و اشیا از این اطلاعات به صورت اشتراکی استفاده می‌کنند. الگوی Flyweight، زمانی که تعداد زیادی اشیا سبک با اطلاعات مشابه داریم، استفاده شده و باعث بهبود کارایی و صرفه‌جویی در مصرف حافظه می‌‌شود. این الگو با کمک الگوهای Singleton و Factorymethod به شکلی کارا اشیا را مدیریت و برنامه‌نویسان را در مواجهه با برنامه‌های پیچیده با تعداد زیادی اشیا، به بهترین شیوه ممکن کمک می‌کند.

۵/۵ - (۲ امتیاز)
نویسنده:

مطالب مرتبط