
به عنوان کسی که مدتی رو با dart و flutter کار کردم برام جای سوال بود فلسفه factory constructor چیه وقتی میشه همون کاری که factory انجام میده رو با static method هم انجام داد.با اندکی جستجو مواردی رو پیدا کردم که factory constructor میتونه مفیدتر واقع بشه.
در ابتدا با یه مثال شروع می کنیم که چرا این دو به هم شبیه هستن.
ابتدا یه کد ساده با استفاده از factory
حالا همین کد با استفاده از static method
همانطور که می بینید نحوه صدا زدن fomJson از کلاس Circle کاملا یکسانه.
کد زیر رو ببینید.
همینطور که می بینید factory constructor همانند یک constructor عادی صدا زده شده اما نکته اینجاست می توانیم رفتار اون رو در مقایسه با یک constructor عادی تغییر بدیم که مثلا در این مثال به جای اینکه Circle Object جدید ساخته بشه ابتدا در Map جستجو میشه که آیا پیش از این ، Circle با این size ساخته شده یا خیر ، در صورت وجود ، circle قبلا ساخته شده رو بر میگردونه ، در غیر این صورت یک Circle جدید رو میسازه ، داخل Map ذخیره میکنه و سپس اون رو بر میگردونه.
در ساخت شی از کلاس های ساده static method و factory تقریبا مزیتی نسبت به همدیگه ندارن اما اگه پای generic ها یه کلاس باز بشه مقداری قضیه فرق می کنه.این مثال رو ببینید.
اگه دقت کنید استفاده از factory اندکی از اضافات کد رو کمتر کرده . اگر در کلاس ، generic های بیشتر و تو در تو داشته باشیم این کاهش اضافات محسوس تر خواهد بود.
فرض کنید دو کلاس داریم که از کلاس abstract Shape گسترش یافته اند و از آنجا که میخواهیم استفاده مستقیم از آن ها رو به library که در آن تعریف شده اند محدود کنیم ، در نام گذاری آن از پیشوند _ استفاده می کنیم.
class _Circle extends Shape { final int innerRadius; _Circle(int outerRadius, [this.innerRadius = 0]) : super(outerRadius); @override double area() => 3.14 * size * size; }
class _Square extends Shape { _Square(int size) : super(size); @override double area() => size * size * 1.0; }
اما میخواهیم کاربر از طریق کلاس والد بتواند به این کلاس ها دسترسی داشته باشد.
اولین روش استفاده از static method هاست. به این صورت که:
همونطور که می بینید پارامتر ها باید دقیقا از متدها به constructor منتقل بشه. شاید برای یک یا دو پارامتر چندان مشکل ساز نباشه اما اگه تعداد پارامترها زیاد شود قطعا خسته کننده خواهد بود. اما حالا همین رو با استفاده factory انجام میدیم.
همانطور که می بینید redirect syntax ویژه برای factory ها کار آسانتر کرده. در flutter جاهای زیادی از این قابلیت استفاده شده مثلا TextButton.icon.
منبع:https://dash-overflow.net/articles/factory