روش کارخانه‌ای mahdi.sg مرداد ۲۴, ۱۴۰۳

روش کارخانه‌ای

همچنین این روش با نام سازنده مجازی (Virtual Constructor) هم شناخته می‌شود.


هـــدف

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

Factory Method pattern

مـسئـــلـه

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

  Adding a new transportation class to the program causes an issue

اگر بقیه کدها قبلاً با کلاس‌های موجود همراه شده باشند، اضافه کردن یک کلاس جدید به برنامه به این سادگی نیست.

خبر خوبی است، درست است؟ اما در مورد کد چطور؟ در حال حاضر، بیشتر کد شما به کلاس کامیون وابسته است. افزودن کشتی‌ها به برنامه نیازمند تغییر در کل پایگاه کد خواهد بود. علاوه بر این، اگر بعداً تصمیم به افزودن نوع دیگری از حمل‌ونقل به برنامه بگیرید، احتمالا مجبور خواهید بود همه این تغییرات را دوباره انجام دهید. در نتیجه، با کدی بسیار ناخوشایند پر از شرط‌هایی که رفتار برنامه را بسته به کلاس اشیاء حمل‌ونقل تغییر می‌دهند، مواجه خواهید شد.

راهــکــــار

الگوی کارخانه‌ی روش پیشنهاد می‌کند که فراخوانی‌های مستقیم ساخت اشیاء (با استفاده از عملگر new) را با فراخوانی‌های یک متد کارخانه‌ی ویژه جایگزین کنید. نگران نباشید؛ اشیاء همچنان از طریق عملگر new ایجاد می‌شوند، اما این عملگر از درون متد کارخانه فراخوانی می‌شود. اشیایی که توسط یک متد کارخانه بازگردانده می‌شوند، اغلب محصول نامیده می‌شوند.

The structure of creator classes

زیر کلاس‌ها می‌توانند کلاس اشیایی را که با روش کارخانه برگردانده می‌شوند، تغییر دهند.

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

The structure of the products hierarchy

همه محصولات باید از یک رابط استفاده کنند.

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

The structure of the code after applying the factory method pattern

تا زمانی که همه کلاس‌های محصول یک رابط مشترک را پیاده‌سازی کنند، می‌توانید اشیاء آن‌ها را بدون شکستن آن به کد مشتری منتقل کنید.

کدی که از روش کارخانه‌ای استفاده می‌کند (که اغلب کد مشتری نامیده می‌شود) تفاوت بین محصولات واقعی برگردانده شده توسط زیرکلاس‌های مختلف را نمی‌بیند. مشتری با تمام محصولات به عنوان یک حمل‌ونقل انتزاعی رفتار می‌کند. مشتری می‌داند که همه اشیاء حمل‌ونقل باید دارای متد تحویل باشند، اما اینکه دقیقا چگونه کار می‌کند برای مشتری مهم نیست.

ســاخــتـــار

 

The structure of the Factory Method pattern

برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــاکلیک کنید.