امروزه و در دنیای برنامه نویسی، همه چیز درباره هزینهها است. صرفهجویی یک مسئله بزرگ در مهندسی نرمافزار محسوب میشود و ساخت اشیا از کلاسها، یک گام پرهزینه است. برای بهبود کارایی، هنگامی در مورد ساخت اشیا از کلاسها حرف میزنیم که یک الگوی طراحی بسیار جالب با ایده مناسبی وجود داشته باشد. ایده اصلی الگوی طراحی پروتوتایپ Prototype این است که به جای ساختن اشیا، آنها را شبیهسازی کنیم. وقتی که ایجاد شی از کلاس زمانبر بوده یا منابع بسیار محدود است، میتوانیم آن را کپی کرده و از توابع اشیای دیگر استفاده کنیم.
در این زمان فقط اولین شی ساخته میشود و میتوانیم بدون دانستن جزئیات کلاسها و درگیر شدن با جزئیات نمونهسازی، از متدهای آن استفاده کنیم. برای مثال تمام رنگها از سه مقدار RGB ساخته شدهاند؛ برای تولید رنگ جدید، ما میتوانیم از کلاسی که قبلا ایجاد نمودهایم استفاده کنیم و فقط مقدار صفتهای RGB را تغییر دهیم. در این مقاله به بررسی الگوی طراحی Prototype و ویژگیهای این الگو میپردازیم.
الگوی طراحی Prototype
همان طور که در الگوهای Factory Method و Abstract Factory دیدیم، آنها به کلاینت اجازه میدادند که به فرایند ایجاد یک شی وابسته نباشد؛ به عبارتی این الگوها اجازه میدادند تا کلاینت با استفاده از یک متد، کلاس مناسب خود را داشته باشد، بدون اینکه به طور دقیق کلاس مناسب خود را ذکر کرده باشد.
اما مشکل هر دو الگو زمانی است که ما بخواهیم یک مجموعه از اشیا شبیه به هم یا مختلف داشته باشیم؛ در این حالت باید به ازای هر کدام از آنها یک Factory داشته باشیم، آن هم وقتی که هزینه ساخت اشیا از کلاسها زیاد است.
در صورتی که الگوی Prototype انعطافپذیرتر است. ایده اصلی این الگو به این صورت است که برای ساخت نمونه از اشیا، به جای استفاده از دستور New در بخشهای مختلف برنامه، از اولین شی ایجاد شده کپیبرداری کنید؛ این کار باعث صرفهجویی در زمان و فضای استفاده شده برای برنامه میشود.
مزیت الگوی طراحی Prototype
مزیت الگوی Prototype نسبت به دو الگوی بالا سرعت بالاتر آن است، به دلیل این که کپی کردن یک شی، از ایجاد یک نمونه جدید از آن شی سرعت بیشتری دارد. همچنین الگوی طراحی Prototype سادهتر است و برای ایجاد یک نمونه جدید از یک شی با استفاده از این الگو لزومی ندارد اطلاعات دقیقی از ساختار داخلی آن کلاس داشته باشیم.
با استفاده از این الگوی طراحی نیازی نیست تا کلاینت درگیر نحوه ایجاد کلاس اصلی باشد و تنها در صورت نیاز، میتواند از کلاس مورد نظر یک کپی تهیه کند. به عنوان مثال فرض کنید میخواهیم چند عدد کیک بپزیم. کیکهایی که در اصل مانند هم هستند و همگی از تخم مرغ، آرد، شیر و … تشکیل شدهاند؛ اما بعضی با سیب تزئین میشوند، بعضی با آناناس و بعضی با پرتقال.
در اینجا راحتتر است که یک Prototype از کیک اصلی داشته باشیم و برای همه کیکها، ابتدا یک کپی از روی آن تهیه و سپس فقط آن را به دلخواه تزئین کنیم.
روشهای ایجاد کپی در الگوی طراحی پروتوتایپ
در این الگو دو روش برای ایجاد کپی داریم:
۱. Shallow Copy
یک کپی سطحی از شی خواهیم داشت؛ به این صورت که تمام عضوهای شی تکرار میشوند اما اگر عضوی اشارهگر باشد، اشیایی که به آنها اشاره شده است کپی نمیشوند و تنها اشارهگر منتقل میشود.
۲. Deep Copy
یک کپی عمیق از شی خواهیم داشت؛ به صورتی که تمام عضوها تکرار خواهند شد و عضوهایی که به صورت اشارهگر هستند، نه تنها اشارهگرها کپی میشوند، بلکه شی مورد اشاره نیز منتقل میشود.
ویژگیهای الگوی طراحی Prototype
در شکل کلاس دیاگرام مربوط به این الگو نمایش داده شده و در زیر آن شرکتکنندگان در آن و نقش هریک بیان شده است.
بنابر گفته GOF هدف از الگوی Prototype عبارت است از:
«استفاده از یک شی به عنوان نمونه، نوع اشیا جدیدی که بایستی ساخته شوند را مشخص کرده و آن اشیا را با ساختن کپیهای جدید از این نمونه ایجاد میکند.»
Class Diagram
نقش کلاسها:
Prototype:
ارائه واسط برای تهیه کپی از خودش.
- شکل ۱: کلاس دیاگرام الگوی Prototype
Concrete Prototype:
پیادهسازی عملهایی برای تهیه کپی از خودش.
Client:
ایجاد شی به وسیله Prototype که یک کپی از خودش را میدهد.
سایر ویژگیهای کلیدی
در جدول زیر به صورت خلاصه هدف الگو، نام یا نامهای دیگری که الگو با آن شناخته میشود، مواقعی که میتوان از این الگو استفاده کرد، مزایا و معایب استفاده از این الگو و الگوهای مرتبط به این الگو توضیح داده شده است.
جدول ۱: ویژگیهای پروتوتایپ
عنوان |
شرح |
نام |
Prototype Pattern |
هدف |
ساخت اشیا با استفاده از نمونههایی از آنها که به عنوان Prototype موجود است. |
نامهای دیگر |
ندارد |
کاربرد |
زمانی از این الگو استفاده کنید که:
|
نتایج |
مزایای این الگو:
معایب این الگو:
|
الگوهای مرتبط |
|
جمعبندی
در این مقاله با الگوی طراحی پروتوتایپ Prototype ویژگیهای آن آشنا شدیم هم چنین الگوهای مرتبط با آن را شناختیم. در یک جدول و به صورت خلاصه سعی کردیم موارد کاربردی این الگو در طراحی نرمافزار را بررسی کرده و به نتایج آن را نیز اشاره کردیم. با توجه به تخصصی بودن این مقاله سعی کردیم که منابع این مقاله را هم در اختیار شما بگذاریم تا در صورت تمایل بتوانید با مطالعه آنها نسبت به این الگو طراحی شناخت بیشتری پیدا کنید. در صورتی که این مقاله برای جالب و کاربردی بود خوشحال می شویم تا نظرات خود را با ما به اشتراک بگذارید.
دیدگاهتان را بنویسید