آموزش درک تفاوت انواع دیزاین پترن های Factory با یکدیگر در 6 قدم

آموزش درک تفاوت انواع دیزاین پترن های Factory با یکدیگر در 6 قدم
در این پست می‌خوانید:

تاحالا بین اینکه فرق بین Factory و Factory Method و Abstract Factory با هم چیه سردرگم نشدی؟ بیا برای حرفه ایی تر شدن این تفاوت ها رو درک بکنیم!

اینجا با موضوع تفاوت میان دیزاین پترن های Factory همراه ما باش!

تفاوت انواع دیزاین پترن های Factory با یکدیگر

در این مقاله در راستای درک تفاوت میان دیزاین پترن های Factory شش موضوع زیر تشریح خواهد شد :

  1. Factory
  2. تابع ایجاد کننده (Creation Method)
  3. Static Creation (or factory) Method
  4. Simply Factory
  5. دیزاین پترن Factory Method
  6. دیزاین پترن Abstract Factory

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

پس بیا برای حرفه ای تر شدن تفاوت میان انواع دیزاین پترن های Factory رو درک بکنیم.

1. Factory

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

به عنوان مثال، هر یک از این موارد  ممکنه به طور تصادفی به عنوان یک Factory ارجاع داده بشه :

  • تابع یا Method ای که رابط کاربری یک برنامه رو ایجاد می کنه
  • کلاسی که کاربران رو ایجاد می کنه
  • متد ایستایی که Constructor کلاس رو به روشی خاص فراخوانی می کنه
  • یکی از دیزاین پترن های Creational

معمولا وقتی کسی واژۀ «Factory» رو می گه، معنای دقیق آن از متن مشخص می شه، البته بهتره پرسش کنی، این احتمال وجود داره که نویسنده ناآگاه باشه.

2. تابع ایجاد کننده (Creation Method)

برای درک بهتر تفاوت های دیزاین پترن های Factory یک مفهومی که باید آن رو درست درک کنیم Creation Method هست

تابع ایجاد، در کتاب Refactoring to patterns چنین تعریف شده :«متدی که شئ ها رو ایجاد می کنه»؛ بدان معنی که هر نتیجه از یک دیزاین پترن Factory Method یک «Creation Method» هست اما نه لزوما برعکس.

همچنین بدین معنی هست که تو می تونی هر جا که مارتین فاولر از عبارت «Factory Method» در کتاب Refactoring استفاده می کنه و Joshua Bloch در کتاب Effective Java استفاده می کنه، عبارت «Creation Method» رو جایگزین کنی.

در واقعیت تابع ایجاد کننده (یا Creation Method) فقط یک پوشش در پیرامون یک فراخوان Constructor هست. ممکنه فقط یک نامی داشته باشه که نیتت رو بهتر بیان کنه. از سوی دیگه ممکنه به جدا سازی کدت از تغییرات Constructor کمک کنه. حتی ممکنه دربردارندۀ منطقی خاصی باشه که بجای ایجاد یک شئ جدید، شئ موجود رو return می کنه.

بسیاری چنین Method هایی رو «Factory Method» می نامن، فقط بدین دلیل که شئ های جدیدی تولید می کنه: منطق ساده هست: Method شئ ها رو ایجاد می کنه و از آنجایی که همۀ Factory ها شئ ها رو ایجاد می کنن، این Method باید به وضوح یک Factory Method باشه. به طور طبیعی وقتی صحبت از دیزاین پترن Factory Method می شه، سردرگمی زیادی وجود داره.

در مثال زیر، next یک Creation Method (تابع ایجادی، تابع ایجاد کننده) هست:

دیزاین پترن های Factory

لینک دانلود سورس کد مثال های این مقاله در انتهای مقاله موجوده

در ادامۀ مقاله دیزاین پترن های Factory می پردازیم به (Static Creation Method یا تابع ایجاد کنندۀ ایستا)

3. Static Creation Method

Static Creation Method یک Creation Method هست که به عنوان static اعلام شده(در کاتلین از Companion Object برای تعریف static بکار می رود). به دیگر سخن می شه آن رو در یک کلاس فراخوانی کرد و نیازی به ایجاد یک شئ نداره.

وقتی کسی متدهایی شبیه به این رو «Static Factory Method» می نامه، گیج نشو. این فقط یک عادته بده. دیزاین پترن Factory Method یک دیزاین پترنی هست که بر روی وراثت متکی هست. اگر آن رو static کنی، دیگه نمی تونی آن رو در subclass ها گسترش بدی، که هدف الگو رو شکست می ده.

زمانی که یک Static Creation Method، شئ های جدید رو بر می گردونه، تبدیل به یک Constructor جایگزین می شه.

ممکنه زمانی سودمند باشه که:

  • تو باید چندین Constructor مختلف داشته باشی که اهداف متفاوتی دارن اما امضای آنها مطابقت داره (امضا یا همان سیگنیچر همان یکی بودن نوع و تعداد پاارمتر هاست). برای مثال داشتن هم Random(int max) و Random(int min) در جاوا و C++ و بسیاری دیگه از زبان ها ناممکنه

و محبوب ترین راه حل ایجاد چندین Method از نوع Static هست که سازندۀ پیش فرض رو فراخوانی کنه و مقدار های مناسب رو پس از آن تنظیم کنه.

  • تو می خواهی به جای ایجاد یک شئ جدید، از شئ های موجود دوباره استفاده کنی(به دیزاین پترن Singleton مراجعه کن). Constructor ها در بیشتر زبان های برنامه نویسی باید نمونه های جدید کلاس رو بر گردونن(نمونه یعنی شئ).

Static Creation Method یک راه حل برای این محدودیت هست. در داخل یک متد استاتیک، کدت می تونه تصمیم بگیره که آیا با فراخوانی سازنده یک نمونۀ جدید ایجاد کنه یا یک شئ موجود رو از حافظۀ پنهان برگردونه(return کنه).

در مثال زیر، متد load یک Static Creation Method هست. این یک راه راحت برای بازیابی کاربران از پایگاه داده ارائه می ده.

دیزاین پترن های Factory

 

4. الگوی Simple Factory

Factory یکی از دیزاین پترن های Factory هست.

 

الگو (Pattern) ی Simple Factory کلاسی رو توصیف می کنه که دارای یک Creation Method با یک شرط بزرگ هست که بر اساس پارامتر های متد انتخاب می کنه کدام product class رو نمونه سازی کنه و سپس return کنه.

فرزانگان (فرزانه یعنی جویندۀ دانش، در اینجا برنامه نویسان غیر ارشد) معمولا Simple Factory ها رو با General Factory (Factory عمومی) یا با یکی از دیزاین پترن های Creational اشتباه می گیرن. در بیشتر موارد، یک Simple Factory یک مرحلۀ میانی برای معرفی دیزاین پترن Factory Method یا Abstract Factory است.

خود من هم در آغاز به علت ندانستن تفاوت میان دیزاین پترن های Factory بار اول هنگام نوشتن مقالۀ یکی از دیزاین پترن های Factory همین اشتباه رو کرده بودم و مقاله رو سهواً بر محور Simple Factory پیش برده بودم و پیش از انتشار آن مقاله متوجه اشتباهم شدم و ناچاراً کلا مقاله رو از نو نوشتم. برای همین لازم هست تفاوت های دیزاین پترن های Factory درستی درک بشه.

یک Simple Factory معمولا با یک Method یکتا در کلاس نمایش داده می شه. با گذشت زمان، این Method ممکنه بیش از حد بزرگ بشه، بنابرین ممکنه تصمیم بگیری بخش هایی از متد رو در subclass ها استخراج کنی.

هنگامی که چندین بار این کار رو انجام بدی، ممکنه متوجه شی که همه چیز به دیزاین پترن Factory Method کلاسیک تبدیل شده.

به هر روی، اگر یک Simple Factory رو به صورت انتزاعی (Abstract) تعریف کنی به طرز جادویی به دیزاین پترن Abstract Factory تبدیل نمی شه.

اینجا یک مثال از Simple Factory رو داریم:

دیزاین پترن های Factory

همانطور که می بینی دانستن تفاوت میان دیزاین پترن های Factory دید مار رو باز تر می کنه.

5. دیزاین پترن Factory Method

Factory Method

دیزاین پترن Factory Method یک دیزاین پترن Creational هست که یک interface برای ساختن شئ ها ارائه می کنه اما به subclass ها اجازه می ده تا Type شئ ایجاد شده رو تغییر بدن.

اگر یک Create Method در کلاس پایه و زیر کلاس هایی داری که آن رو گسترش می دن، احتمالا که داری به Factory Method نگاه می کنی.

برای مشاهدۀ مثال دیزاین پترن Factory Method به مقالۀ مربوط بهش یک سر بزن

Factory Method یکی دیگر از دیزاین پترن های Factory بود؛ یکی دیگر از دیزاین پترن های Factory دیزاین پترن Abstract Factory هست

6. دیزاین پترن Abstract Factory

Abstract Factory

دیزاین پترن Abstract Factory یکی دیگر از دیزاین پترن های Factory از نوع Creational هست که اجازه می ده خانواده هایی از شئ های مرتبط یا وابسته به هم، رو بدون مشخص کردن concrete کلاس های آنها (کلاس های مشخصشان) تولید بشه.

تعریف : یک کلاس concrete کلاسی است که می تواند نمونه سازی شود، در مقابل کلاس های انتزاعی که نمی توانند.

«یک خانواده از شئ ها» یعنی چه؟ برای نمونه، این مجموعه از کلاس ها رو انتخاب کن: Transport + Engine + Controls که به معنا های کنترل ها و موتور و حمل و نقل هستن، ممکنه چندین نوع از این موارد وجود داشته باشه:

  1. Car + CombustionEngine + SteeringWheel
  2. Plane + JetEngine + Yoke

که به ترتیب به معنا های ماشین برای حمل و نقل، موتور احتراقی برای موتور و فرمون خودرو برای هدایت خودرو

و برای ردیف دوم هواپیما برای حمل و نقل، موتور جت به عنوان و موتور و یوغ به عنوان ابزار هدایت یا همان control بکار برده شده

اگر برنامت با خانواده ای از محصولات (Products) کار نمی کنه، پس نیازی به یک Abstract Factory نداری

و بازم بسیاری از فرزانگان دیزاین پترن Abstract Factory رو با یک کلاس Simple Factory که به صورت Abstract تعریف شده قاطی می کنن. اینکار رو نکن!

اکنون که تفاوت میان دیزاین پترن های Factory رو با هم بررسی کردیم شاید بد نباشه دوباره مقاله های آموزشی دیزاین پترن Abstract Factory و دیزاین پترن Factory Method رو مرور کنی. دیزاین پترن های Factory در برنامه نویسی مشهور هستن و با دیزاین پترن های دیگر مرتبط هستن.

 

دیدگاه‌ها ۰
ارسال دیدگاه جدید