گروه نرم افزاری هیلتن

مهندسی نرم افزار: الگو های طراحی

الگوی طراحی Prototype



امروزه همه چیز، برنامه نویسی در مورد هزینه ها هست. صرفه جویی یک مسئله بزرگ در مهندسی نرم افزار است، و ساخت اشیا از کلاس ها یک گام پرهزینه می باشد. برای بهبود کارایی وقتی در مورد ساخت اشیا از کلاس ها حرف میزنیم یکی الگوی طراحی بسیار جالب وجود دارد که ایده مناسبی دارد. ایده اصلی الگوی Prototype این است که، به جایی ساختن اشیا آن را شبیه سازی کنیم. وقتی که ایجاد شی از کلاس زمان بر یا منابع بسیار محدود است می توان آن را کپی نمود و از توابع اشیای دیگر استفاده نمود. در این زمان فقط اولین شی ساخته می شود و بدونه دانستن جزئیات کلاس ها و درگیر شدن با جزئیات نمونه سا زی از متد-های آن استفاده می کنیم. برای مثال تمام رنگ ها از سه مقدار RGB ساخته شده اند، که برای تولید رنگ جدید ما می توانیم از کلاس که قبلا ایجاد نموده ایم استفاده کنیم و فقط مقدار صفت های RGB را تغییر بدهیم. برای کپی کردن یک شی دو روش وجود دارد:

1-Shallow : در این نوع کپی برداری تمام صفت ها حتی اگر صفت یک شی باشد، کپی می شود. در نتیجه با تغییر شی مقصد شی مبدا نیز تغییر پیدا می کند. در این مورد شی مقصد تمام مقادیر شی مبدا را کپی می کند.

- Deep : در این نوع کپی دو شی مقصد و مبدا کاملا از هم جدا و به صورت مستقل ایجاد می شوند.

هدف: بالا بردن سرعت نمونه سازی و ایجاد اشیا از کلاس با استفاده از کپی کردن است.

انگیزه: در حالت عادی ما از دستور New برای نمونه سازی استفاده می کنیم. اما در بیشتر مواقع در زمان ساخت اشیا پیکر بندی های زیادی لازم است انجام شود که زمان و هزینه زیادی مصرف می شود. در چنین شرایطی بهتر است به جای نمونه سازی مجدد از کپی کردن اشیا استفاده کنیم.

کاربرد:
• کاهش زمان نمونه سازی از کلاس های سنگین با پیکر بندی زیاد
• کاهش تعداد اشیایی استفاده شده
• برخی کلاس ها را از دید کلاینت مخفی کنیم.

ساختار: در شکل زیر نمودار کلاس الگوی Prototype را می توان مشاهده نمود.

نمودار کلاس دیاگرام الگوی Prototype

اجزا:
شکل کلی همه ی کلاس های که می خواهند قابلیت نمونه سازی داشته باشند را تعریف می کند.
Concrete Prototype: کلاسی که می خواهد قابلیت کپی داشته باشد.
Client: کلاینتی است که برای به دست آوردن نمونه جدید از یک Concrete Prototype متد Clone() را برای نمونه سازی فرا خوانی می کند.

الگو های مرتبط:
• از الگوی Abstract Factory می توان برای نمونه سازی از کلاس های استفاده کرد.
• می توان الگوی prototype را در یک شی سبک وزن پیاده سازی کنید و برای ایجاد شی جدید از آن استفاده کرد.

پیامد:
1- کلاس ها می توانند از دید کلاینت پنهان شود لذا تعداد نام های که کلاینت باید بداند کاهش پیدا می کند.
2- برای یک کلاس می توان چندین Prototype ایجاد کرد.

نقاط قوت:
1- ساده سازی و تسریع روند نمونه سازی از کلاس های بزرگ و سنگین یا کلاس های با پیکر بندی زیاد
2- ایجاد و حذف Prototype ها در زمان اجرا، این الگو انعطاف پذیری زیادی دارد.

نقاط ضعف:
1- پیاده سازی منطق کپی، ساده نیست.
2- استفاده نا درست از این الگو می تواند خطر ناک باشد.

همانطور که در الگوهای Factory Method و Abstract Factory دیدیم به Client اجازه می‌دادند به فرآیند ایجاد یک شئ وابسته نباشد؛ به عبارتی این الگوها اجازه می‌دادند تا Client با استفاده از یک متد کلاس مناسب خود را داشته باشد بدون اینکه دقیقا کلاس مناسب خود را ذکر کرده باشد. اما مشکل هر دو الگو زمانی است که ما بخواهیم یک مجموعه از شئ‌ها شبیه به هم یا مختلف داشته باشیم، باید به ازای هرکدام از آن‌ها یک Factory داشته باشیم و مورد دیگر اینکه هزینه ساخت اشیا از کلاس ها زیاد است در صورتی که الگوی Prototype انعطاف‌پذیرتر است. ایده اصلی این الگو به این صورت است که برای ساخت نمونه از اشیاء به جای استفاده ازدستور New در بخش‌های مختلف برنامه، از اولین شی ایجاد شده، کپی برداری کنید که این کار باعث صرفه جویی در زمان و فضای استفاده شده برای برنامه می‌شود. بنابراین مزیت الگوی Prototype نسبت به دو الگوی بالا سرعت بالاتر آن است بدلیل اینکه کپی کردن یک شئ از ایجاد یک نمونه جدید شئ سرعت بیشتری دارد و همچنین از طرف دیگر الگوی طراحی Prototype ساده تر است و برای ایجاد یک نمونه جدید از یک شئ با استفاده از این الگو لزومی ندارد اطلاعات دقیقی از ساختار داخلی آن کلاس داشته باشیم. با استفاده از این الگو نیازی نیست تا Client در گیر نحوه ایجاد کلاس اصلی باشد و تنها در صورت نیاز، می‌تواند از کلاس مورد نظر یک کپی تهیه کند. به عنوان مثال فرض کنيد مي خواهيم چند عدد کيک بپزيم. کيک هايي که در اصل مانند هم هستند و همگي از تخم مرغ و آرد و شير و غيره تشکيل شده اند. اما بعضي با سيب تزئين مي شوند و بعضي با آناناس و بعضي با پرتقال. در اينجا راحت تر است يک Prototype از کيک اصلي داشته باشيم و براي همه کيک ها ابتدا يک کپي از روي آن تهيه کنيم و سپس فقط آن را به دلخواه تزئين نمائيم.







گروه برنامه نویسی هیلتن

گروه برنامه نویسی هیلتن