این روش تضمین میکند که همه اشیایی که ایجاد میکند با یک رابط مشترک مطابقت دارند، بنابراین میتوانید بدون نگرانی از جزئیات پیادهسازی، با آنها کار کنید.
یکی از کاربردهای واضح الگوی روش Factory در یک برنامه فلاتر، تولید عناصر رابط کاربری با استایل بومی برای پلتفرمهای مختلفه.
در این مثال، یه کارخانه دکمهساز هوشمند پلتفرمی میسازیم که دکمههای مناسب برای اندروید یا iOS را تحویل میدهد.
abstract class PlatformButton {
factory PlatformButton(TargetPlatform platform) {
switch (platform) {
case TargetPlatform.android: return AndroidButton();
case TargetPlatform.iOS: return IosButton();
default: return null;
}
}
Widget build({
@required BuildContext context,
@required Widget child,
@required VoidCallback onPressed
});
}
برای دسترسی به ویجتهای ElevatedButton با طراحی متریال و ویجتهای CupertinoButton با استایل iOS، ابتدا کتابخانههای مناسب فلاتر ایمپورت میکنیم.
درست همانند مثال اشکال از بخش قبلی، یه کلاس انتزاعی برای قرار دادن متد کارخانه ایجاد میکنیم.
constructor کارخانهای PlatformButton، بر اساس مقدار پارامتر platform، یه نمونه از کلاسی که PlatformButton رو پیادهسازی میکنه، برمیگردونه.
TargetPlatform یک enum هست که توسط فریمورک Flutter ارائه شده و برای هر کدوم از پلتفرمهای پشتیبانیشده فلاتر مقادیری داره.
بخش switch اینجا وظیفه داره که یه نمونه دکمه مطابق با ترجیح کاربر برگردونه. توجه داشته باشین که AndroidButton و IosButton هنوز ایجاد نشدن، اما نگران نباشین، به زودی میرسیم بهشون.
PlatformButton همچنین یه اعلان پیادهسازی نشده برای متد build() داره تا انتظار ایجاد کنه که پیادهکنندهها اون رو با یه signature سازگار override میکنند.
متد build() پارامترهایی رو میگیره که توسط ویجتهای دکمه خاص پلتفرم مورد نیاز هستند.
class AndroidButton implements PlatformButton {
@override
Widget build({
@required BuildContext context,
@required Widget child,
@required VoidCallback onPressed
}) {
return ElevatedButton(
child: child,
onPressed: onPressed,
);
}
}
class IosButton implements PlatformButton {
@override
Widget build({
@required BuildContext context,
@required Widget child,
@required VoidCallback onPressed
}) {
return CupertinoButton(
child: child,
onPressed: onPressed,
);
}
}
منبع: الگوی طراحی Factory در برنامه نویسی چیست + مثال عملی در فلاتر