نمونه اولیه (prototype)
هـــدف
مـسئـــلـه
تصور کنید شیئی دارید و میخواهید یک کپی دقیق از آن ایجاد کنید. چگونه این کار را انجام میدهید؟ ابتدا باید یک شی جدید از همان کلاس ایجاد کنید. سپس باید تمام فیلدهای شی اصلی را مرور کنید و مقادیر آنها را به شی جدید کپی کنید.
خوب است! اما یک مشکل وجود دارد. همه اشیاء را نمیتوان به این روش کپی کرد زیرا برخی از فیلدهای شی ممکن است خصوصی باشند و از خارج از خود شی قابل مشاهده نباشند.
کپی کردن یک شی “از بیرون” همیشه امکان پذیر نیست.
مشکل دیگری نیز با رویکرد مستقیم وجود دارد. از آنجایی که برای ایجاد یک نسخه تکراری باید کلاس شی را بدانید، کد شما به آن کلاس وابسته میشود. اگر وابستگی اضافی شما را نمیترساند، یک مشکل دیگر نیز وجود دارد. گاهی اوقات شما فقط رابطی را که شی از آن پیروی میکند میدانید، اما کلاس مشخص آن را نمیدانید، مثلاً زمانی که یک پارامتر در یک متد هر شیئی را که از یک رابط پیروی میکند میپذیرد.
الگوی نمونه اولیه فرایند کپیبرداری را به خود اشیاء مورد کپیبرداری واگذار میکند. این الگو یک رابط مشترک برای تمام اشیایی که از کپیبرداری پشتیبانی میکنند، اعلام میکند. این رابط به شما امکان میدهد بدون اتصال کد خود به کلاس آن شی، یک شی را کپی کنید. معمولاً چنین رابطی تنها یک متد کپی دارد.
پیادهسازی متد کپی در همه کلاسها بسیار مشابه است. این متد یک شی از کلاس فعلی ایجاد میکند و تمام مقادیر فیلدهای شی قدیمی را به شی جدید منتقل میکند. حتی میتوانید فیلدهای خصوصی را کپی کنید زیرا اکثر زبانهای برنامهنویسی به اشیاء اجازه میدهند تا به فیلدهای خصوصی سایر اشیایی که متعلق به همان کلاس هستند دسترسی داشته باشند.
شیئی که از کپیبرداری پشتیبانی میکند، نمونه اولیه نامیده میشود. هنگامی که اشیاء شما دارای دهها فیلد و صدها پیکربندی ممکن هستند، کپی کردن آنها ممکن است به عنوان جایگزینی برای زیرکلاسیسازی عمل کند.
نمونه های اولیه از پیش ساخته شده می توانند جایگزینی برای طبقه بندی فرعی باشند.
به این صورت کار میکند: شما مجموعهای از اشیاء را با پیکربندیهای مختلف ایجاد میکنید. هنگامی که به شیئی مانند شی پیکربندی شده نیاز دارید، به جای ساختن یک شی جدید از ابتدا، یک نمونه اولیه را کپی میکنید.