متد Factory
شناسه پست: 3069
بازدید: 803

متد Factory یک الگوی طراحی سازنده است که یک رابط کاربری را برای ایجاد اشیاء بدون مشخص کردن کلاسهای واقعی آنها فراهم می کند. این الگو، متدی را تعریف می کند که می توانیم از آن برای ایجاد یک شی به جای استفاده از سازنده آن شئ استفاده کنیم. نکته مهم این است که subclasse ها می توانند این متد را override کنند و اشیایی از انواع مختلف ایجاد کنند.

در این مقاله، میخواهیم به شما نشان دهیم که چطور یک الگوی طراحی متد Factory را پیاده سازی کنید. علاوه بر این، میخواهیم یاد بگیریم که چطور از تکنیک refactoring متد Factory برای مخفی کردن سازنده و استفاده از متد خود برای افشاسازی آن استفاده کنیم.

این مقاله، بخشی از مجموعه آموزشی زیر است:

ما با یک پیاده سازی ساده از Factory شروع می کنیم و به تدریج آن را بهبود میدهیم تا به یک Factory پرکاربرد و readable برای اشیاء خود برسیم.

برای مشاهده لیست کامل مقالات این مجموعه آموزشی، الگوهای طراحی #C را بررسی کنید.

این مقاله، به قسمتهای زیر تقسیم میشود:

پیاده سازی متد Factory

برای پیاده سازی الگوی متد Factory، ما قصد داریم یک برنامه ساده تهویه مطبوع ایجاد کنیم. برنامه ما، یک ورودی را از کاربر میگیرد و بر اساس آن ورودی، اکشن مورد نظر (سرد کردن یا گرم کردن اتاق) trigger خواهد شد. پس با یک اینترفیس شروع میکنیم:

حالا کلاسهای واقعی را برای پیاده سازی این اینترفیس نیاز داریم:

بسیار خب. ما زیرساخت خود را آماده کردیم. حالا باید یک سازنده Factory برای این اشیاء ایجاد کنیم.

کلاسهای Factory 

ما قصد داریم با کلاس AirConditionerFactory abstract شروع کنیم:

این کلاس abstract، یک رابط برای ایجاد شیء در کلاسهای مشتق شده ارائه میدهد. با این اوصاف، کلاسهای creator واقعی خود را پیاده سازی میکنیم:

عالی. حالا ما آماده ایم تا از متدهای Factory خود استفاده کنیم. در خیلی از مثالها، ما می توانیم عبارت switch را ببینیم که از طریق ورودی کاربر switche میکند و کلاس Factory مورد نیاز را انتخاب می کند.

این رویکرد درست کار میکند.

اما تصور کنیم که تعداد زیادی کلاسهای factory داشته باشیم که در پروژه های بزرگ، چیز رایجی هم است که در نتیجه منجربه به وجود آمدن یک عبارت switch case خیلی بزرگ میشود که کاملا ناخوانا است. بنابراین ما قصد داریم از رویکرد دیگری استفاده کنیم.

Factory Execution

با یک شمارنده ساده برای تعریف اقدامات تهویه مطبوع شروع میکنیم:

در ادامه، ما قصد داریم کلاس AirConditioner را ایجاد کنیم که در آن، کاربر میتواند نوع action را مشخص کرده و factory مناسب را اجرا کند. factory های واقعی ما از کلاس abstract مورد نظر ارث بری میکنند و ما قصد داریم از این ساختار، در پیاده سازی بعدی خود استفاده کنیم:

این، روش بهتری برای اجرای factory ما نسبت به استفاده از دستور switch-case است. اما ما می توانیم آن را به شیوه ای پویاتر نیز انجام دهیم. طوریکه مجبور نباشیم به صورت دستی، action و سازنده factory را برای هر action اضافه کنیم. در نتیجه، برای رفع این مسئله، از reflection در پروژه خود استفاده میکنیم:

حالا چه رویکرد اولی را انتخاب کنیم چه این دومی، نتیجه یکسان خواهد بود:

Factory Execution

یک چیز دیگر را باید به این کلاس اضافه کنیم و آن متدی است که سازنده مناسب را اجرا میکند:

حالا، وقت آن است که یک فراخوانی از یک کلاینت ایجاد کنیم. در یک پروژه واقعی، ما مطمئناً ابتدا دمای فعلی را بررسی می کنیم و سپس فقط یک factory خواهیم داشت تا تصمیم بگیرد که آیا باید آن دما را پایین بیاوریم یا بالاتر ببریم. اما به دلیل ساده نگه داشتن مسئله، ما فقط می خواهیم یک فراخوانی ساده به سمت کلاس AirConditioner خود برقرار کنیم:

نتیجه همانی است که انتظار میرفت:

مثالی از متد Factory

استفاده از تکنیک Refactoring متد Factory

ما میتوانیم از متد Factory برای جایگزینی سازنده خود در حین ایجاد یک شئ استفاده کنیم. اگر سازنده ما، شامل مقدار زیادی کد باشد، بهتر است آن را با متد factory جایگزین کنیم. علاوه بر این، میتوانیم چند متد factory با نامهای با مسما و همچنین نامهای پارامتری داشته باشیم که جایگزین یک سازنده واحد میشود.

این خوانایی کد را به مقدار قابل توجهی افزایش میدهد.

در نهایت، آن به ما کمک میکند تا یک سینتکس زنجیروارانه را نیز پیاده سازی کنیم.

پس کلاس AirConditioner را با متد factory تغییر میدهیم:

نحوه فراخوانی کلاینت ما نیز باید تغییر کند:

بسیار عالی. نتیجه باید مانند قبل باشد با این تفاوت که اینبار از تکنیک Refactoring متد Factory استفاده کردیم.

نتیجه گیری

با خواندن این مقاله موارد زیر را یاد گرفتیم:

  • چطور الگوی طراحی متد Factory  را به داخل اپلیکیشن خود پیاده سازی کنیم.
  • چند راه جایگزین برای دستور switch-case با استفاده از یک dictionary یا reflection
  • نحوه refactor کردن کد خود با استفاده از تکنیک Refactoring متد Factory

نویسنده

امید عباسی
من امید عباسی هستم. سالهاست که در زمینه برنامه نویسی با تکنولوژی دات نت فعالیت میکنم و عاشق این هستم که تجربیات و دانش خودم را در این زمینه با دیگران به اشتراک بزارم. خیلی دوست دارم که نظر و انتقاد خودتون رو در مورد این نوشته برای من بنویسید تا بتونم در آینده، مطالب بهتر و ارزشمندتری را برای شما فراهم کنم. در صورت داشتن هرگونه سوال هم در قسمت دیدگاه ها میتونید با بنده در ارتباط باشید