الگوی ProtoType
یکی از الگوهای ساده است که تنها باید بدانید چه زمانی باید از آن استفاده کنید.
دقیقا چه مشکلاتی با استفاده از این الگو قابل حل است؟؟
1- زمانی است که ساختن یک شی جدید بسیار هزینه بر است.
2- زمانی است که میخواهیم state یک شی موجود را با ساخت شی جدید در آن شی جدید نیز عینا داشته باشیم. به عبارت دیگر دقیقا یک کپی از شی موجود لازم داریم. به عنوان مثال، این شی موجود الان رو میخواهیم وضعیت حال حاضرشو حفظ کنیم و بعد تغییراتی رو روی اون بدیم. یعنی یک کپی از اون میخوایم بگیریم بزاریم کنار.
3- زمانی است که نمیخواهیم کسی مستقیما به constructorهای کلاس ما دسترسی داشته باشند ولی باید بتوانند یک شی جدید از آن کلاس ایجاد نمایند. یعنی نتونه new کنه ولی بتونه از اون شی بسازه.
مثال کاربردی: قبض برق اومده و من بنابر دلایلی نیاز دارم که دو تا قبض تلفن داشته باشم. اگه بخوام به اداره آب مراجعه کنم و درخواست یه قبض دیگه بدم، اونا باید وارد نرم افزار بشن، کلی مراحل رو از ابتدا طی کنن تا بتونن در نهایت به من یه خروجی از همون قبض بدن(هزینه بالا).
ولی بهتر نبود از طریق یه دستگاه فتوکپی از اون قبض یه کپی تهیه میکردم؟؟؟
یعنی بجای ایجاد یک شی کاملا مشابه از شی موجود و طی کلیه مراحل Construction آن شی– یعنی new کردن و set کردن property ها – از شی موجود کپی تهیه میکنم.
ولی چگونه؟؟؟؟
کافیه اون کلاسی که میخواهی به اون قابلیت کپی کردن بدی رو از اینترفیس Iclonable پیاده سازی کنی ودر متد Clone اش بنویسی
;()return MemberwiseClone
و سپس برای ایجاد کپی به راحتی مینویسی
()MyClass.Clone
زمانی که اشیا خونده شده از دیتابیس یا از یک وب سایت یا هر IO دیگه ای رو بخوای نگهداری کنی یا ازشون کپی جدید ایجاد کنی، میتونی از این الگو بهره ببری تا هزینه خواندن از دیتابیس برای اشیا بعدی رو نداشته باشی.
توجه: دونوع کپی داریم:
1- Shallow Copy یا کپی کم عمق:
تنها یک شی رو با فیلدها و پروپرتیای ازنوع پایه مثل int, string , ... رو کپی میکنه ولی نمیتونه انواع complex مثل ارجاع به یک کلاس دیگه رو کپی کنه - روش بالا
2- Deep Copy یا کپی عمیق:
میتونی شی رو با تمام انواع پایه و complexاش کپی بگیری و روش دیگه ای رو برای پیاده سازی اون باید به کار بگیری که در روزهای آینده به اون خواهم پرداخت.
برچسب:
نویسنده: امیر کریمی