دیزاین پترن ها در سال ۱۹۹۴ توسط گروهی به نام Gang of Four در سه دسته عمومی طبقه بندی شدند. به آن دسته از الگوهای طراحی که با هدف مدیریت ایجاد اشیا توسعه یافته اند، الگوهای طراحی سازنده یا Creational میگویند. الگوی طراحی پروتوتایپ یا Prototype یکی از الگویهای طراحی سازنده است که به منظور جلوگیری از ساخت یک شی جدید استفاده میشود.
این الگوی طراحی راهکاری برای ایجاد یک شی جدید به واسطه کپی کردن آن از اشیا موجود دیگر ارائه میدهد. با استفاده از این تکنیک بدون اینکه وابستگی میان شی جدید و کلاسی که از آن ساخته شده است ایجاد شود، میتوان اشیا جدیدی در نرم افزار تولید کرد. همچنین در مواردی که مواقع نیاز به ایجاد تغییرات در اشیا جدید وجود دارد تا بتوانیم اشیایی از یک نوع و با پارامترهایی متفاوت ایجاد کنیم.
مثلا تصور کنید بخواهید از یک شی ماشین چندین کپی ایجاد کنید با این تفاوت که هر کدام رنگی متفاوت داشته باشد. با استفاده از الگوی طراحی پروتوتایپ دیگر نیاز نیست که هر بار یک شی جدید از کلاس ایجاد کنید و سپس پارامترهای آن را مشخص کنید. زیرا شما میتوانید از کلاس ماشین یک شی ایجاد کنید و سپس از آن به تعدادی که نیاز دارید کپی (Clone) تولید کنید.
چرا باید از الگوی طراحی Prototype استفاده کنیم
تصور کنید که قصد دارید یک محصول را بر اساس نمونه خارجی آن بسازید. برای بومی سازی این محصول، تنها راهی که در پیش دارید این است که کاملاً با پارامترها و ویژگی های ساختاری نمونه خارجی آشنا باشید. اما از آنجایی که فناوری های مرتبط با ساخت آن محصول انحصاری هستند و به راحتی در اختیار دیگران قرار نمی گیرند، این امر برای شما میسر نخواهد بود. با این حال، تصور کنید که یک دستگاه شبیه ساز سه بعدی عظیم برای الگوبرداری از اشیا در اختیار دارید. با این دستگاه می توانید نمونه خارجی را وارد کرده و یک شبیه سازی از آن را دریافت کنید. این ماشین شبیه ساز عملکردی مشابه با الگوی طراحی پرتوتایپ دارد.
بنابراین،
اگر بخواهید از یک شیء موجود در نرم افزار، دقیقاً یک نسخه تکثیر شده ایجاد کنید، ابتدا باید یک شیء جدید از کلاس مربوطه ایجاد کنید. سپس باید تمامی پارامترها و ویژگی های شیء اصلی را دریافت کرده و بر روی شیء جدید اعمال نمایید. اما این روش همیشه به درستی عمل نخواهد کرد، زیرا بعضی از پارامترها و ویژگی های یک شیء ممکن است به صورت خصوصی (private) تعریف شده باشند. در این صورت، دسترسی به آنها از خارج کلاس امکان پذیر نخواهد بود.
بنابراین، یکی از مشکلات تکثیر اشیا در برنامه نویسی به صورت مستقیم، عدم دسترسی به برخی پارامترهای خصوصی است. پس تکثیر یک شیء خارج از کلاس آن همیشه ممکن نخواهد بود. از سوی دیگر، از آنجایی که شما اشیای تکثیر شده را بر پایه کلاس های شیء مبدأ ایجاد می کنید، اشیای جدید به این کلاس ها وابسته می شوند و این امر باعث ایجاد وابستگی های زیاد در میان کلاس ها خواهد شد.
راه حل الگوی طراحی پروتوتایپ
در الگوی طراحی پروتوتایپ، یک رابط مشترک برای همه شیءهایی که نیاز به تکثیر دارند، تعریف میشود. این رابط به شما امکان میدهد تا یک شیء را بدون نیاز به بازنویسی کد در کلاس آن شیء، تکثیر کنید. معمولاً، این رابط تنها شامل یک متد به نام “Clone” (تکثیر) است. با پیروی کلاسهای شیء از این رابط، دیگر نیازی به نوشتن متدهای اضافی یا ایجاد مجدد یک شیء نخواهیم داشت. فقط کافی است متد Clone را در کلاسها پیادهسازی کنیم.
پیادهسازی متد Clone در تمام کلاسها بسیار مشابه است. این متد باید یک شیء جدید از کلاس فعلی ایجاد کند و سپس تمام مقادیر خصوصیتهای آن را به شیء جدید منتقل نماید. یکی دیگر از مزایای این الگوی طراحی این است که میتوانید خصوصیتهای خصوصی را نیز تکثیر کنید، زیرا بیشتر زبانهای برنامهنویسی اجازه میدهند که شیءها به فیلدهای خصوصی شیءهای دیگر که متعلق به یک کلاس هستند، دسترسی پیدا کنند.
به شیءهایی که کلاسهای آنها از قابلیت تکثیر پشتیبانی میکنند، “پروتوتایپ” گفته میشود. همچنین هنگامی که شیءها دارای دهها خصوصیت و صدها تنظیم باشند، میتوانید از شیءهای تکثیر شده به عنوان جایگزینی برای کلاسهای فرزند استفاده کنید. با این کار در نرمافزار دیگر نیازی به ساخت کلاسهای فرزند از کلاس اصلی نخواهید داشت، زیرا میتوانید شیءهای ساخته شده بر اساس کلاس اصلی را متناسب با نیازهایتان تغییر دهید.
بنابراین اگر بخواهیم روش کار این الگو را خلاصه کنیم، باید گفت که شما در ابتدا باید مجموعهای از شیءها را با پیکربندیهای مختلف ایجاد کنید. سپس هر زمان که به یک شیء با یکی از پیکربندیهای تنظیم شده نیاز داشتید، کافی است یک پروتوتایپ را بر اساس آن ایجاد کنید و دیگر نیازی به ساخت یک شیء جدید از ابتدا نخواهید داشت.
مثالی از الگوی طراحی پروتوتایپ در دنیای واقعی
در دنیای واقعی، نمونههای اولیه برای آزمایش و ارزیابی قبل از تولید انبوه محصولات استفاده میشوند. اما در الگوی طراحی پروتوتایپ، نمونههای اولیه نه برای آزمایش یا کنترل کیفیت، بلکه به صورت مستقیم در بخشهای مورد نیاز نرمافزار به کار گرفته میشوند. بهترین مثال از این الگوی طراحی در دنیای واقعی، فرآیند تقسیم سلولی است.
فرض کنید یک کلاس به نام “سلول” در نرمافزار تعریف شده است. برای اینکه این سلول به یک موجود پیچیدهتر تبدیل شود، نیاز به تکثیر و ایجاد نمونههای متعدد دارد. بنابراین، به هزاران یا میلیونها شیء از این کلاس نیاز است تا اندامهای مختلف یک موجود زنده را شکل دهند و هر کدام وظیفه خاصی را انجام دهند. اگر بخواهید همه این شیءها را به صورت مستقیم و یکییکی بسازید و خصوصیتهای آنها را مقداردهی کنید، زمان زیادی صرف خواهد شد.
بر این اساس، بهترین راه برای انجام این کار، استفاده از الگوی طراحی پروتوتایپ است. در این الگو، سلولها بر اساس سلول اولیه تکثیر میشوند و دیگر نیازی به ساخت سلولها و مقداردهی خصوصیتهای آنها به صورت یکییکی نیست. با توجه به اینکه در فرآیند تقسیم سلولی، سلولهای جدید از سلول اولیه ایجاد میشوند، میتوان گفت که سلول اصلی به عنوان یک پروتوتایپ عمل میکند.
کاربردهای الگوی طراحی Prototype
به کارگیری الگوی طراحی پروتوتایپ در طراحی نرم افزارها، باعث کاهش میزان کدنویسی خواهد شد. مزیت اصلی این دیزاین پترن افزایش سرعت کپی کردن یک شی از شیهای است. زیرا این عمل خیلی سریعتر از ساخت اشیا میباشد. در عملیات کپی کردن اشیا تابع سازنده آنها (Constructor) دیگر اجرا نخواهد شد. الگوی طراحی سازنده در موارد زیر کاربرد خواهد داشت:
- برای کاهش تعداد کلاسهای فرزند (Subclass) استفاده میشود. همچنین با این روش میتوان اشیا ساخته شده را متناسب با نیازهای مختلف پیکربندی کرد.
- به منظور جلوگیری از ایجاد وابستگی میان شی کپی شده به کلاس مورد نظر استفاده میشود.
- زمانی که بخواهیم از یک کلاس با پارامترهای Private زیاد شی ایجاد کنیم.
نتیجه گیری
الگوی طراحی نمونه اولیه یا Prototype به منظور جلوگیری از ساخت یک شی جدید استفاده میشود. استفاده از این تکنیک در برنامه نویسی شی گرا مزایای زیادی به همراه خواهد داشت همانطور که مشاهده کردید برخلاف برخی از الگوهای طراحی دیگر، پیاده سازی این دیزاین پترن بسیار ساده است.