سلام. میتونید برای آشنایی با الگوهای طراحی (یا همون دیزاین پترن های) زبان جاوا و دیدن لیست مقالات آموزشیشون، به مقاله ی مراجعه کنید. همونطور که گفته شده زیرمجموعه ی الگوهای تکوینی یا ساختنی هست و لیست مقالات آموزشی من در مورد الگوهای Creational عبارت هستند از: Creational Design Patterns هنگامی که سیستم باید مستقل از چگونگی ایجاد و ارایه محصولاتش باشه، وقتی که کلاس ها برای نمونه سازی در زمان اجرا مشخص می شن، زمانی که میخوایم شی های مختلفی از یک کلاس را نسازیم و یک شی را که داریم ساده تر کنیم و هزینه‌ای بابت ساخت شی جدید نپردازیم، و سایر اوقات مشابه، از دیزاین پترن Prototype استفاده میکنیم. با یه مثال ساده از این پترن شروع میکنیم: برای پیاده سازی این پترن، اول یه اینترفیس بصورت زیر میسازیم: این اینترفیس یه تابع داره به اسم getClone پس هر کلاسی بخواد از این کلاس ارث ببره باید این تابع رو پیاده بکنه. خب برای اینکه ببینیم چجوری میخوایم از این اینترفیس استفاده کنیم بریم سراغ کلاس کارمند: همونطور که توی کلاس بالا میبینیم، تابع getClone اصطلاحا override شده که وظیفش برگردوندن یه شی جدید از شی فعلی هست، و خروجی این تابع Prototype هست (که این کلاس ما هم خودش نوعی Prototype هست) ما در حقیقت از شی فعلی یه کپی تهیه میکینم و برمیگردونیم. برای پیاده سازی این روند هم به شکل زیر عمل میکنیم: همین! ما یه Prototype pattern ساده رو پیاده کردیم. در حقیقت اومدیم از پترن Prototype برای ساخت شی جدید بدون وارد کردن تک تک اطلاعات استفاده کردیم و فقط یه کپی از شی قبلی ساختیم و برگردوندیم. برای اینکه بیشتر با این مفهوم آشنا شیم بریم سراغ یه مثال دیگه. این دفعه هم یه اینترس فیس البته به اسم Cloneable ، و یه کلاس که لیستی از اسم کارمندها رو نگه میداره تعریف میکنیم: این مثال هم شبیه مثال قبلی یه اینترفیس داره و کلاس لیست کارمندا ( Employees ) از اینترفیس Cloneable ارث برده، بناربراین باید تابع clone رو پیاده سازی بکنه، و داخل این تابع یه شی کپی از Employees میسازیم و برمیگردونیم. برای استفاده و تست میتونیم از کدای زیر استفاده کنیم: خروجی کد بالا بصورت زیره: همونطور که میبینیم، براحتی شی های جدیدی ساختیم و هرکدوم مستقل از هم عمل میکنن. به عبارت دیگه لازم نیست هربار قطعه کد زیر صدا زده بشه: و برای ساخت لیست جدید فقط از تابع clone استفاده میکنیم. خب بریم سراغ یه مثالی که یکمی با دو تا مثال قبلش متفاوته. (خود جاوا کلاسی داره به اسم که میتونین در موردش مطالعه کنین) کلاس رنگ رو بصورت زیر در نظر میگیریم: و کلاس های رنگ آبی و سیاه رو از این کلاس ارثبری میکنیم (با پارامتر count بعدا کار داریم) : خب تا اینجا که فقط یه کلاس رنگ و دو تا کلاس آبی و سیاه که از کلاس رنگ ارث میبرن تعریف کردیم. حالا کلاس ColorStore رو پیاده میکنیم: این کلاس یه Map استاتیک داره که لیستی از رنگ ها رو نگهداری میکنه (که داخل قسمت static { دو تا رنگ سیاه و آبی بصورت پیشفرض بهش اضافه شدن) و یه تابع که با گرفتن اسم رنگ، یه شی از اون رنگ برمیگرودنه. کد زیر رو ببینیم تا بیشتر متوجه بشیم میخوایم چیکار کنیم: خب خروجی طبیعتا به شکل زیر هست: حالا اگه کد بالا این کدهارو بنویسیم: نتایج زیر دیده میشه: دلیلش هم اینه که newBlueColor اول از blueColor کپی میشه و مقدار count ش برابر هست و با فراخوانی دوباره ی تابع addColor ش یدونه به اضافه میکنه و نتیجه میشه . ولی نکته اینجاست که شی newBlueColor با شی blueColor تفاوت داره، به این معنی که اگه در ادامه ی کد بالا این خطوط رو اضافه کنیم: خروجی زیر رو میبینیم که اعداد هستن: و اگه همینجا توی ادامه خطوط زیر رو اضافه کنیم: اعداد count اشیا blueColor و blackColor هنوز هستن که با فراخوانی تابع addColor به تغییر میکنن: این مثال بیشتر به درد چه زمانهایی میخوره. ؟ مثلا فرض کنیم میخوایم از هر رنگ چندتا تعریف کنیم، مثلا سه رنگ آبی، آبی روشن و آبی تیره. کافیه یه پارامتر (مثلا concentration ) که نوع روشن و تیره بودن رو مشخص میکنه به کلاس blueColor اضافه کنیم، و برای تعریفشون خطوط زیر رو صدا بزنیم: طبیعتا این فقط یه مثاله و میشه بجای string از کد رنگی یا هر چیز دیگه ای استفاده کنیم، یا مثلا به رنگ ها ویژگی اضافه یا تغییراتی توشون اعمال کرد. مهم اینه که مفهوم clone شدن رو متوجه بشیم و بدونیم خط زیر هربار یه کپی از رنگ آبی اولیه ای که به colorMap اضافه کرده بودیم برمیگردونه. خب اگه خوب متوجه شده باشیم این الگو میتونه خیلی کارآمد باشه و احتمالا بخاطر این دلایل بتونه به دردمون بخوره: سهولت توی تعریف اشیا، حذف بعضی از وابستگی های شی گرایی، کاهش ارثبری های بیهوده، کپی کردن سریع اشیا و. و البته که مفهوم کلی Prototyping و فلسفش بطور خلاصه ایجاد ساختار اولیه یا به اصطلاح مشخص کردن یسری خط مشی واسه پیاده سازی کدهاست. و ما فقط بخشی از مثال های این مفهوم رو که تحت عنوان الگوی Prototype design pattern توی زبان جاوا قابل پیاده سازی هست دیدیم. منتشر شده در توسط این وبسایت : virgool . io / @ mohammad . ghodsian