Factory — ایک تخلیقی پیٹرن جو آبجیکٹ کی تخلیق فیکٹری طریقوں کو سونپتا ہے۔ موبائل ڈیویلپمنٹ میں، Factory Method اور Abstract Factory کا استعمال ViewModel، NetworkClient، Repository اور دیگر انحصارات بنانے کے لیے کیا جاتا ہے۔ Factory انسٹیٹی ایشن منطق کو الگ کرتا ہے، نفاذ کی تبدیلی کو آسان بناتا ہے۔ مزید تفصیلات — Refactoring Guru: Factory Method پر۔
اہم نکات
Factory — GoF کیٹلاگ سے ایک تخلیقی ڈیزائن پیٹرن۔ بنیادی خیال: آبجیکٹ تخلیق کی منطق کو کلائنٹ کوڈ سے علیحدہ طریقہ یا کلاس میں منتقل کرنا۔ کلائنٹ ایک انٹرفیس یا تجریدی کلاس کے ساتھ کام کرتا ہے، جبکہ ٹھوس نفاذ فیکٹری کے ذریعے بنایا جاتا ہے۔ یہ ڈیپنڈنسی انورژن اصول کو نافذ کرتا ہے: کلائنٹ ٹھوس کلاسوں پر نہیں، صرف تجریدوں پر منحصر ہے۔
دو اقسام Factory کی: Factory Method اور Abstract Factory۔ Factory Method — ایک کلاس میں ایک طریقہ جسے ذیلی کلاس آبجیکٹ بنانے کے لیے اووررائڈ کرتی ہیں۔ Abstract Factory — ایک دوسرے سے متعلق آبجیکٹ کے گروپ بنانے کے لیے فیکٹری طریقوں کا خاندان رکھنے والا انٹرفیس۔ دونوں اقسام ایک ہی مسئلہ حل کرتی ہیں: کلائنٹ براہ راست new MyClass() نہیں کہتا، بلکہ فیکٹری سے اس کی قسم یا پیرامیٹرز کے مطابق آبجیکٹ بنانے کے لیے کہتا ہے۔
Factory vs new() — براہ راست آبجیکٹ تخلیق کوڈ کو ایک ٹھوس نفاذ سے مضبوطی سے جوڑتا ہے۔ Factory ایک پرت شامل کرتا ہے: نفاذ کی تبدیلی کے لیے تمام کلائنٹس میں نہیں بلکہ صرف فیکٹری میں ترمیم کی ضرورت ہوتی ہے۔ موبائل ڈیویلپمنٹ میں، Factory کو فعال طور پر ViewModel (ViewModelProvider.Factory)، نیٹ ورک کلائنٹ (Retrofit.create())، فہرست ایڈاپٹر اور سیریلائزیشن فیکٹریاں بنانے کے لیے استعمال کیا جاتا ہے۔ DI کنٹینر (Dagger, Koin) خودکار طور پر فیکٹریاں تیار کرتے ہیں۔
Factory Method — ایک پروٹوکول یا تجریدی کلاس میں اعلان کردہ طریقہ جو ایک مخصوص قسم کا آبجیکٹ لوٹاتا ہے۔ ذیلی کلاس طریقہ کو نافذ کرتی ہیں، ٹھوس مثالیں بناتی ہیں۔ Swift میں، یہ پروٹوکول میں جامد طریقہ یا بنیادی کلاس میں طریقہ ہو سکتا ہے۔ Kotlin میں — فیکٹری طریقہ کے ساتھ companion object یا تجریدی کلاس میں open fun۔ پیٹرن وسیع پیمانے پر پارسر، خرابی فیکٹریاں اور سوالیہ بلڈر بنانے کے لیے استعمال ہوتا ہے۔
protocol PaymentGateway {
func processPayment(amount: Decimal) async throws -> PaymentResult
}
final class StripeGateway: PaymentGateway { /* ... */ }
final class ApplePayGateway: PaymentGateway { /* ... */ }
enum PaymentType { case stripe, applePay }
final class PaymentFactory {
// Factory Method
static func create(type: PaymentType) -> PaymentGateway {
switch type {
case .stripe: return StripeGateway()
case .applePay: return ApplePayGateway()
}
}
}
// استعمال
let gateway = PaymentFactory.create(type: .stripe)
Kotlin ورژن Factory Method اقسام کو محدود کرنے کے لیے companion object یا sealed class استعمال کرتا ہے۔ Sealed class اس بات کی ضمانت دیتی ہے کہ when شاخ تمام ممکنہ اقسام کا احاطہ کرتی ہے — مرتب کرنے والا مکمل ہونے کی جانچ کرتا ہے۔ یہ Android منصوبوں کے لیے عام ہے جہاں فیکٹری build flavour یا ترتیب کے مطابق مختلف Repository یا DataSource نفاذ تخلیق کرتی ہے۔
sealed class PaymentType {
object Stripe : PaymentType()
object ApplePay : PaymentType()
}
interface PaymentGateway {
suspend fun processPayment(amount: BigDecimal): PaymentResult
}
class PaymentFactory {
companion object {
fun create(type: PaymentType): PaymentGateway = when (type) {
PaymentType.Stripe -> StripeGateway()
PaymentType.ApplePay -> ApplePayGateway()
}
}
}
Abstract Factory — ان کی ٹھوس کلاسیں بتائے بغیر ایک دوسرے سے متعلق یا ایک دوسرے پر منحصر آبجیکٹ کے خاندان بنانے کا ایک پیٹرن۔ کلائنٹ تجریدی فیکٹری انٹرفیس کے ساتھ کام کرتا ہے، جو خاندان کی ہر مصنوعات بنانے کے لیے طریقے متعین کرتا ہے۔ ایک ٹھوس فیکٹری انٹرفیس کو نافذ کرتی ہے اور ایک مخصوص قسم کے آبجیکٹ بناتی ہے۔ مثال کے طور پر، iOS کے لیے UI جزو فیکٹری UIButton، UILabel، UITableView بناتی ہے، جبکہ Android کے لیے — Button، TextView، RecyclerView۔
Abstract Factory vs Factory Method — Factory Method وراثت کے ذریعے ایک قسم کا آبجیکٹ بناتا ہے، Abstract Factory ترکیب کے ذریعے آبجیکٹ کا خاندان بناتا ہے۔ Factory Method ذیلی کلاسوں میں اووررائڈ کیا جاتا ہے، Abstract Factory ایک پروٹوکول کے ذریعے متعدد فیکٹری طریقے فراہم کرتا ہے۔ Abstract Factory میں اکثر کئی Factory Method ہوتے ہیں۔ موبائل ڈیویلپمنٹ میں، Abstract Factory پلیٹ فارم پر منحصر اجزاء، تھیم ڈیزائن اور ڈیٹا بیس فیکٹریوں کے لیے استعمال ہوتا ہے۔
| خصوصیت | Factory Method | Abstract Factory |
|---|---|---|
| مصنوعات کی تعداد | ایک | خاندان (متعدد) |
| میکانزم | وراثت (override) | ترکیب (پروٹوکول/انٹرفیس) |
| iOS مثال | PaymentFactory.create() | iOS/Android کے لیے UIComponentFactory |
| Android مثال | ViewModelProvider.Factory | ThemeFactory: بٹن، متن، کارڈ بنانا |
| لچک | سادہ ذیلی کلاس تبدیلی | مکمل خاندان تبدیلی |
حقیقی مثال Android میں Abstract Factory — ایک واحد DatabaseFactory انٹرفیس کے ذریعے مختلف ڈیٹا بیس کی اقسام (SQLite vs Room) کا نفاذ۔ فیکٹری DAO آبجیکٹ، منتقلی اور کنکشن پول بناتی ہے۔ iOS میں — مختلف ماحول (Development/Staging/Production) کے لیے سروس فیکٹری۔ Abstract Factory شاذ و نادر ہی براہ راست استعمال ہوتا ہے — اس کے افعال DI کنٹینر (Dagger Module, Swinject Assembly) سنبھال لیتے ہیں۔
Swift Factory پروٹوکول اور جامد طریقوں کے ذریعے نافذ کیا جاتا ہے۔ Factory پروٹوکول ایک create() طریقہ اعلان کرتا ہے جو تجریدی قسم لوٹاتا ہے۔ ایک ٹھوس فیکٹری پروٹوکول کو نافذ کرتی ہے اور مطلوبہ آبجیکٹ بناتی ہے۔ Swift سادہ صورتوں کے لیے علیحدہ فیکٹری کلاس کی ضرورت نہیں رکھتا — enum یا struct میں جامد طریقہ کافی ہے۔ پیچیدہ منظرناموں کے لیے، DI انجیکشن کے ساتھ Factory پروٹوکول استعمال ہوتا ہے۔
iOS SDK میں Factory — بہت سے سسٹم فیکٹریاں: UIStoryboard.instantiateViewController(withIdentifier:)، NSKeyedUnarchiver.unarchivedObject(ofClass:from:)، JSONDecoder().decode(_:from:)۔ ڈیویلپر ViewController (StoryboardFactory)، خدمات (ServiceFactory) اور ڈیٹا ماڈل کے لیے فیکٹریاں بناتے ہیں۔ Factory Method VIPER اور Clean Swift آرکیٹیکچر میں اسکرین ماڈیول بنانے کے لیے فعال طور پر استعمال ہوتا ہے۔
Factory + DI — ایک جدید متبادل: DI کنٹینر (Swinject, Factory) رجسٹرڈ اقسام کے لیے خودکار طور پر فیکٹریاں تیار کرتا ہے۔ کنٹینر آبجیکٹ تخلیق کی ترکیبیں محفوظ کرتا ہے اور انحصار حل کرتا ہے۔ Factory لائبریری (github.com/hmlongco/Factory) خودکار انجیکشن کے لیے @Injected(.service) استعمال کرتی ہے۔ DI فیکٹریاں ایک سطر سے پورے ماڈیول کو تبدیل کرکے جانچی جاتی ہیں: container.register { MockService() }۔
Android Factory — ایک کلاسک مثال: پیرامیٹرز کے ساتھ ViewModel بنانے کے لیے ViewModelProvider.Factory۔ Google خودکار ViewModel فیکٹری تخلیق کے لیے Hilt استعمال کرنے کی سفارش کرتا ہے — @HiltViewModel اینوٹیشن خودکار طور پر Factory بناتا ہے۔ سادہ آبجیکٹ کے لیے، create() یا invoke() طریقہ کے ساتھ companion object استعمال ہوتا ہے۔ Kotlin میں، invoke آپریٹر فیکٹری کو فنکشن کی طرح کال کرنے کی اجازت دیتا ہے: Factory(param)۔
Jetpack Compose میں Factory — فیکٹریاں حالت اور اثر بنانے کے لیے استعمال ہوتی ہیں۔ remember { Factory.create() } پہلی رینڈر پر ایک آبجیکٹ بناتا ہے اور composable کی زندگی بھر اسے محفوظ رکھتا ہے۔ Compose میں ViewModel viewModel() کے ذریعے بنایا جاتا ہے — یہ Hilt کے زیر انتظام ایک فیکٹری ہے۔ Compose میں، فیکٹریاں واضح طور پر کم عام ہیں، کیونکہ DI اور Compose StateManager آبجیکٹ تخلیق سنبھالتے ہیں۔
Factory vs Hilt — Dagger/Hilt مرتب وقت پر خودکار طور پر فیکٹریاں تیار کرتا ہے۔ @Module + @Provides Factory Method کی جگہ لیتا ہے، @Binds Abstract Factory کی جگہ لیتا ہے۔ دستی فیکٹریاں رن ٹائم میں متحرک نفاذ انتخاب (A/B ٹیسٹنگ، فیچر فلیگ) کے لیے متعلقہ رہتی ہیں۔ جامد انحصار کے لیے، Hilt آبجیکٹ تخلیق کو مکمل طور پر خودکار کرتا ہے — ڈیویلپر صرف انٹرفیس اور اینوٹیشن لکھتا ہے۔
اکثر پوچھے گئے سوالات
Factory Method وراثت کے ذریعے ایک قسم کا آبجیکٹ بناتا ہے — ذیلی کلاس فیکٹری طریقہ کو اووررائڈ کرتی ہے۔ Abstract Factory ترکیب کے ذریعے آبجیکٹ کا خاندان بناتا ہے — فیکٹری انٹرفیس متعدد مصنوعات کے لیے طریقے اعلان کرتا ہے۔ Factory Method آسان ہے، Abstract Factory پلیٹ فارم پر منحصر یا موضوعاتی اجزاء کے لیے زیادہ لچکدار ہے۔
Factory رن ٹائم میں متحرک نفاذ انتخاب (A/B ٹیسٹ، فیچر فلیگ، مختلف درجوں کے لیے مختلف API) کے لیے موزوں ہے۔ DI (Hilt, Dagger, Koin) جامد انحصار کے لیے ترجیحی ہے — یہ تخلیق اور انجیکشن کو خودکار کرتا ہے۔ Factory اور DI ایک دوسرے کو خارج نہیں کرتے: DI ماڈیول کے اندر Factory استعمال کر سکتا ہے۔
Factory کو پروٹوکول کے ذریعے فیکٹری تبدیل کرکے جانچا جاتا ہے۔ جانچ میں ایک TestFactory بنائی جاتی ہے جو ایک ہی پروٹوکول کو نافذ کرتی ہے اور mock-آبجیکٹ لوٹاتی ہے۔ جامد Factory طریقوں کے لیے، جانچ زیادہ پیچیدہ ہے — اس کے لیے DI کنٹینر یا swizzling کی ضرورت ہے۔ جانچ پذیری برقرار رکھنے کے لیے ہمیشہ Factory کے لیے پروٹوکول استعمال کرنے کی سفارش کی جاتی ہے۔
ViewModelProvider.Factory Jetpack کا ایک انٹرفیس ہے جو حسب ضرورت پیرامیٹرز کے ساتھ ViewModel بنانے کی اجازت دیتا ہے۔ فیکٹری کے بغیر، ViewModel عکاسی کے ذریعے بنایا جاتا ہے اور صرف خالی کنسٹرکٹر ہو سکتا ہے۔ Factory پیرامیٹرز (ذخیرہ، ایپلیکیشن سیاق) قبول کرتا ہے اور انہیں ViewModel کنسٹرکٹر کو بھیجتا ہے۔ Hilt @HiltViewModel کے لیے خودکار طور پر Factory بناتا ہے۔
Factory اوپن/کلوزڈ اصول کو نافذ کرتا ہے: نظام توسیع کے لیے کھلا ہے (نیا نفاذ فیکٹری میں شامل کیا جاتا ہے) لیکن تبدیلی کے لیے بند ہے (کلائنٹ کوڈ تبدیل نہیں ہوتا)۔ نئی مصنوعات کی قسم شامل کرنے کے لیے تمام کلائنٹس میں نہیں بلکہ صرف فیکٹری میں ترمیم کی ضرورت ہے۔ یہ براہ راست آبجیکٹ تخلیق پر Factory کا بنیادی فائدہ ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں