آشنایی با الگوی طراحی Factory


در این آموزش قصد داریم تا یک الگوی طراحی تحت عنوان Factory Design Pattern را معرفی کرده و همچنین لزوم به‌کارگیریِ آن در برنامه‌نویسی شیئ‌گرا را شرح دهیم. به طور کلی، این الگوی طراحی زیرشاخۀ الگوهای Creational قرار می‌گیرد که در ادامه و در قالب مثالی کاربردی در زبان برنامه‌نویسی PHP آن را پیاده‌سازی خواهیم کرد.

در پاسخ به این پرسش که «اساساً در چه شرایطی از دیزاین پترن فکتوری در توسعۀ اپلیکیشن استفاده می‌کنیم؟» باید گفت در صورتی که بخواهیم هر یک از کلاس‌های پیاده‌سازی‌شده در اپلیکیشن‌مان وظایف واحدی را بر عهده داشته باشند که این امر خود بر قانونی تحت عنوان Single Responsibility Principle یا به اختصار SRP اشاره دارد که برای کسب اطلاعات بیشتر در این رابطه می‌توانید به دورهٔ آموزش قوانین SOLID مراجعه نمایید.

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

این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

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

دانلود فایل‌های تمرین

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
رضا
رضا برنامه نویس علاقمند به وب اپلیکیشن
۱۳۹۹/۰۷/۲۷
میشه لطفا در مورد کلاس CarOrder، خط ۱۰ بیشتر توضیح بدید؟ آبجکت car$ چه‌طور به متد ()getModel دسترسی پیدا کرده؟ چون این متد در داخل شرطِ کلاس CarFactory استفاده شده. ضمن این که در خط بالایی (خط ۹) داریم car$ برابر با
(this-car-make($model$ = car$
پس چه‌طور در خط بعدی car$ به ()getModel دسترسی پیدا کرده؟
مرسی
mohsenshahbazi
mohsenshahbazi
۱۳۹۹/۰۷/۱۰
به نظرم مشابه Adapter باز هم در CarOrder که استفاده کردید OCP نقض شده .
به نظر میاد Design Pattern ها بیشتر در تناقض با SOLID هستند و بعضا حتی در تقابل . چون با استفاده کامل از pattern شما نمیتونید SOLID را پیاده سازی کنید . مثلا اگر در فکتوری بخوای OCP رو رعایت کنی میریم به سمت نقض SRP .
e.kiasaty
e.kiasaty
۱۳۹۹/۰۳/۳۰
مقاله خوبیه ولی متن زیر که در ابتدای مقاله اومده، اشتباس:

«در صورتی که بخواهیم هر یک از کلاس‌های پیاده‌سازی‌شده در اپلیکیشن‌مان وظایف واحدی را بر عهده داشته باشند که این امر خود بر قانونی تحت عنوان Single Responsibility Principle یا به اختصار SRP اشاره دارد»

برخلاف باور جا افتاده، SRP ربطی به تک‌وظیفه بودن یک کلاس نداره. بلکه SRP کلا برای حل موضوع دیگه‌ای مطرح شده و میگه:
«هر کلاس تنها یک دلیل برای تغییر باید داشته باشه»
مجید
مجید
۱۳۹۸/۰۱/۱۸
مثال کاملا شبیه استراتژی پترن بود به نظرم که می‌شد مثال بهتری زد