روش کارخانهای
همچنین این روش با نام سازنده مجازی (Virtual Constructor) هم شناخته میشود.
هـــدف
الگوی طراحی کارخانهی روش، الگویی ساختاری است که رابطهای برای ایجاد اشیاء در یک کلاس پایه فراهم میکند، اما به زیرکلاسها اجازه میدهد تا نوع اشیاء ایجاد شونده را تغییر دهند.
مـسئـــلـه
تصور کنید که در حال ایجاد یک برنامه مدیریت لجستیک هستید. اولین نسخه از برنامه شما تنها میتواند حملونقل با کامیون را مدیریت کند، بنابراین بخش عمدهی کد شما در کلاس کامیون قرار دارد. پس از مدتی، برنامه شما بسیار محبوب میشود. هر روز درخواستهای بسیاری از شرکتهای حملونقل دریایی دریافت میکنید تا لجستیک دریایی را در برنامه بگنجانید.
اگر بقیه کدها قبلاً با کلاسهای موجود همراه شده باشند، اضافه کردن یک کلاس جدید به برنامه به این سادگی نیست.
خبر خوبی است، درست است؟ اما در مورد کد چطور؟ در حال حاضر، بیشتر کد شما به کلاس کامیون وابسته است. افزودن کشتیها به برنامه نیازمند تغییر در کل پایگاه کد خواهد بود. علاوه بر این، اگر بعداً تصمیم به افزودن نوع دیگری از حملونقل به برنامه بگیرید، احتمالا مجبور خواهید بود همه این تغییرات را دوباره انجام دهید. در نتیجه، با کدی بسیار ناخوشایند پر از شرطهایی که رفتار برنامه را بسته به کلاس اشیاء حملونقل تغییر میدهند، مواجه خواهید شد.
راهــکــــار
الگوی کارخانهی روش پیشنهاد میکند که فراخوانیهای مستقیم ساخت اشیاء (با استفاده از عملگر new) را با فراخوانیهای یک متد کارخانهی ویژه جایگزین کنید. نگران نباشید؛ اشیاء همچنان از طریق عملگر new ایجاد میشوند، اما این عملگر از درون متد کارخانه فراخوانی میشود. اشیایی که توسط یک متد کارخانه بازگردانده میشوند، اغلب محصول نامیده میشوند.
در نگاه اول، ممکن است این تغییر بیمعنی به نظر برسد: ما فقط فراخوانی سازنده را از یک قسمت از برنامه به قسمت دیگر منتقل کردیم. با این حال، این را در نظر بگیرید: اکنون میتوانید متد کارخانه را در یک زیرکلاس بازنویسی کرده و کلاس محصولات ایجاد شده توسط این متد را تغییر دهید. البته محدودیتی وجود دارد: زیرکلاسها فقط میتوانند انواع مختلفی از محصولات را بازگردانند اگر این محصولات دارای یک کلاس پایه یا رابط مشترک باشند. همچنین، متد کارخانه در کلاس پایه باید نوع بازگشتی خود را به عنوان این رابط اعلام کند.
برای مثال، هر دو کلاس کامیون و کشتی باید رابط حملونقل را پیادهسازی کنند که متدی به نام تحویل را اعلام میکند. هر کلاس این متد را به شکلی متفاوت پیادهسازی میکند: کامیونها بار را از طریق خشکی تحویل میدهند، کشتیها بار را از طریق دریا تحویل میدهند. متد کارخانه در کلاس لجستیک جادهای اشیاء کامیون را برمیگرداند، در حالی که متد کارخانه در کلاس لجستیک دریایی کشتیها را برمیگرداند.
کدی که از روش کارخانهای استفاده میکند (که اغلب کد مشتری نامیده میشود) تفاوت بین محصولات واقعی برگردانده شده توسط زیرکلاسهای مختلف را نمیبیند. مشتری با تمام محصولات به عنوان یک حملونقل انتزاعی رفتار میکند. مشتری میداند که همه اشیاء حملونقل باید دارای متد تحویل باشند، اما اینکه دقیقا چگونه کار میکند برای مشتری مهم نیست.
ســاخــتـــار
برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــاکلیک کنید.