الگوی طراحی پروتوتایپ یا نمونه اولیه (Prototype)



visibility  
mode_comment   ۰

دیزاین پترن ها در سال 1994 توسط گروهی به نام Gang of Four در سه دسته عمومی طبقه بندی شدند. به آن دسته از الگوهای طراحی که با هدف مدیریت ایجاد اشیا توسعه یافته اند، الگوهای طراحی سازنده یا Creational می گویند. الگوی طراحی پروتوتایپ یا Prototype یکی از الگوی های طراحی سازنده است که به منظور جلوگیری از ساخت یک شی جدید استفاده می شود.

الگوی طراحی دیزاین پترن Prototype

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

مثلا تصور کنید بخواهید از یک شی ماشین چندین کپی ایجاد کنید با این تفاوت که هر کدام رنگی متفاوت داشته باشد. با استفاده از الگوی طراحی پروتوتایپ دیگر نیاز نیست که هر بار یک شی جدید از کلاس ایجاد کنید و سپس پارامترهای آن را مشخص کنید. زیرا شما می توانید از کلاس ماشین یک شی ایجاد کنید و سپس از آن به تعدادی که نیاز دارید کپی (Clone) تولید کنید.

چرا باید از الگوی طراحی Prototype استفاده کنیم

تصور کنید که تصمیم گرفته اید یک هواپیما بر اساس نمونه خارجی آن بسازید. برای بومی ساز این هواپیما تنها راهی که پیش روی شما خواهد بود این است که دقیقا از پارامترها و ویژگی های ساختاری نمونه خارجی آن آگاه باشید. اما از آنجایی که تکنولوژی هایی مربوط به ساخت هواپیماها انحصاری هستند و به راحتی در اختیار دیگر شرکت ها قرار نمی گیرند، این امر برای شما امکان پذیر نخواهد بود. اما تصور کنید که یک ماشین کپی سه بعدی غول پیکر برای شبیه سازی اشیا داشته باشید. با این کار می توانید هواپیما خارجی به آن دستگاه وارد کرده و هواپیما شبیه سازی خود را دریافت کنید. این ماشین شبیه ساز کاری شبیه الگوی طراحی پروتوتایپ انجام می دهد.

پروتوتایپ نمونه اولیه دیزاین پترن Prototype

بنابراین اگر بخواهید از شی ای موجود در نرم افزار دقیقا یک کپی ایجاد کنید. ابتدا باید یک شی جدید از کلاس مورد نظر ایجاد کنید. سپس باید تمام پارامترها و ویژگی های شی اصلی را دریافت کرده و بر روی جسم جدید اعمال کنید. اما این روش همیشه به درستی عمل نخواهد کرد زیرا بعضی از پارامترها و ویژگی های یک شی ممکن است به صورت خصوصی یا Private تعریف شده باشند. در این صورت دیگر امکان دسترسی به آن ها از خارج از کلاس امکان پذیر نخواهد بود.

بنابراین یکی از مشکلات کپی کردن اشیا در برنامه نویسی به صورت مستقیم، عدم دسترسی به برخی از پارامترهای خصوصی است. پس کپی کردن یک شی خارج از کلاسش همیشه امکان پذیر نخواهد بود. از طرفی دیگر به دلیل اینکه شما اشیای کپی شده را بر پایه کلاس های شی مبدا ایجاد می کنید، اشیای جدید به این کلاس ها وابسته می شوند و این کار باعث ایجاد وابستگی های زیاد در بین کلاس ها خواهد شد.

راه حل الگوی طراحی پروتوتایپ

در الگوی طراحی نمونه اولیه یک Interface مشترک برای تمام اشیایی که باید کپی شوند در نظر گرفته می شود. این Interface به شما اجازه می دهد که یک شی را بدون نیاز به دوباره نویسی کدها در کلاس شی، کپی کنید. معمولا، چنین Interface شامل تنها یک تابع به اسم Clone (کپی) هستند. پس با پیروی کلاس های مربوط به اشیا از این Interface دیگر نیازی به نوشتن توابع اضافه و یا استفاده از ایجاد مجدد یک شی نخواهیم داشت. برای این کار فقط کافی است تابع Clone را در کلاس ها پیاده سازی کنیم.

پیاده سازی تابع Clone در همه کلاس ها بسیار شبیه به هم است. این تابع وظیفه دارد تا یک شی از کلاس فعلی ایجاد کند و سپس تمام مقادیر پارامترهای آن را به شی جدید منتقل می کند. همچنین مزیت دیگری که این الگوی طراحی در اختیار شما می گذارد این است که حتی می توانید پارامترهای Private را کپی کنید. زیرا اکثر زبان های برنامه نویسی اجازه می دهند که اشیاء به فیلدهای خصوصی از اشیاء دیگر که متعلق به یک کلاس هستند دسترسی پیدا کنند.

به اشیایی که کلاس های آن ها از قابلیت کپی شدن پشتیبانی کنند یک نمونه اولیه یا Prototype نامیده می شوند. همچنین هنگامی که اشیا دارای ده ها پارامتر و صدها تنظیمات باشند، می توانید از اشیا کپی شده به عنوان جایگزینی برای کلاس های فرزند استفاده شوند. با این کار در نرم افزار دیگر نیازی به ساخت کلاس های فرزند از کلاس اصلی نخواهید داشت. زیرا می توانید اشیا ساخته شده بر اساس کلاس اصلی را متناسب با نیازهایی که دارید تغییر دهید.

الگوی طراحی نمونه اولیه دیزاین پترن Prototype

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

مثالی از الگوی طراحی پروتوتایپ در دنیای واقعی

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

نمونه اولیه دیزاین پترن Prototype

تصور کنید که یک کلاس به اسم سلول (Cell) در نرم افزار تعریف شود. برای اینکه این سلول به یک موجود تکامل یافته تبدیل شود، نیاز به تکثیر و نمونه سازی دارد. بنابراین به هزاران یا میلیون ها شی از این کلاس نیاز خواهیم داشت تا اندام های مختلف یک موجود زنده را تشکیل دهند و هر کدام به وظیفه خاص خود بپردازد. حال تصور کنید، اگر می خواستید همه این اشیا را به صورت مستقیم و یک به یک بسازید و پارامترهای آن ها را مقدار دهی کنید، چه میزان از زمان شما مصرف می شد.

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

کاربردهای الگوی طراحی Prototype

الگوی طراحی دیزاین پترن Prototype design pattern پروتوتایپ

به کارگیری الگوی طراحی پروتوتایپ در طراحی نرم افزارها، باعث کاهش میزان کدنویسی خواهد شد. مزیت اصلی این دیزاین پترن افزایش سرعت کپی کردن یک شی از شی های است. زیرا این عمل خیلی سریع تر از ساخت اشیا می باشد. در عملیات کپی کردن اشیا تابع سازنده آن ها (Constructor) دیگر اجرا نخواهد شد. الگوی طراحی سازنده در موارد زیر کاربرد خواهد داشت:

  • برای کاهش تعداد کلاس های فرزند (Subclass) استفاده می شود. همچنین با این روش می توان اشیا ساخته شده را متناسب با نیازهای مختلف پیکربندی کرد.
  • به منظور جلوگیری از ایجاد وابستگی میان شی کپی شده به کلاس مورد نظر استفاده می شود.
  • زمانی که بخواهیم از یک کلاس با پارامترهای Private زیاد شی ایجاد کنیم.

پیاده سازی الگوی طراحی پروتوتایپ

در این بخش به بررسی مراحل پیاده‌ سازی الگوی طراحی نمونه اولیه می پردازیم، سپس با استفاده از زبان برنامه نویسی PHP این الگو را در قالب یک مثال پیاده سازی خواهیم کرد. مراحل پیاده سازی این الگو عبارتند از :

  1. ابتدا باید یک Interface تعریف شود. سپس در آن یک تابع تحت عنوان Clone ایجاد گردد. سپس کلاس های مورد نظر باید از این Interface پیروی کنند و تابع Clone را پیاده سازی کنند. این گام برای قانونمند ساختن نرم افزار استفاده می شود و در صورت تشخیص می توان از آن صرف نظر کرد.
  2. سپس در کلاس نمونه اولیه باید از یک متد Constructor جدید به نام Clone تعریف شود. این Constructor وظیفه دارد مقادیر پارامترهای تعریف شده در کلاس را از شی اصلی دریافت کند و به نمونه جدید ساخته شده، منتقل سازد.

مثال از الگوی طراحی Prototype در دنیای واقعی

این مثال به شما نشان می دهد که چگونه با استفاده از الگوی نمونه اولیه صفحه ای که پارامترهای زیادی دارد را کپی کنید. کلاس صفحه دارای بسیاری از پارامتر های Private است که به لطف الگوی نمونه اولیه به شی کپی شده منتقل می شوند. زیرا اگر بخواهیم از این صفحه یک پیش نویس ذخیره کنیم باید تمام پارامترهای آن را دریافت کنیم و این کار به دلیل Private بودن پارامترهای کلاس بدون استفاده از این روش امکان پذیر نخواهد بود.

نتیجه گیری

الگوی طراحی نمونه اولیه یا Prototype به منظور جلوگیری از ساخت یک شی جدید استفاده می شود. استفاده از این تکنیک در برنامه نویسی شی گرا مزایای زیادی به همراه خواهد داشت همانطور که مشاهده کردید برخلاف برخی از الگوهای طراحی دیگر، پیاده سازی این دیزاین پترن بسیار ساده است. به نظر شما از این الگوی طراحی برای چه کاربردهایی در نرم افزارها می توان استفاده کرد؟ آیا تاحالا از این الگو استفاده کرده اید؟

متخصص PHP
اگر دوست داری برنامه نویسی PHP رو حرفه ای یاد بگیری آیا می دانید بیش از ۸۰% وب سایت های موجود در ایران از جمله لیدرهای بازار وب (اسنپ، اسنپ فود، نت برگ، دیجیکالا، الوپیک و ... ) زبان برنامه نویسی PHP را به عنوان زبان اصلی برای پیاده سازی امکانات سمت سرور خود انتخاب کردند! متخصص PHP arrow_back
7Learn Experts
comment دیدگاه کاربران

add_circle ارسال دیدگاه

خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :