Factory — obyekt yaratishni fabrika metodlariga topshiruvchi yaratuvchi pattern. Mobil rivojlanishda Factory Method va Abstract Factory ViewModel, NetworkClient, Repository va boshqa bog'liqliklarni yaratish uchun ishlatiladi. Factory instansiya yaratish mantiqini izolyatsiya qilib, implementatsiyalarni almashtirishni osonlashtiradi. Batafsil — Refactoring Guru: Factory Method.
Asosiy fikrlar
Factory — GoF katalogidagi yaratuvchi dizayn patterni. Asosiy g'oya: obyekt yaratish mantiqini mijoz kodidan alohida metod yoki klassga chiqarish. Mijoz interfeys yoki abstrakt klass bilan ishlaydi, aniq implementatsiya esa fabrika tomonidan yaratiladi. Bu bog'liqliklarni teskari qilish prinsipini (Dependency Inversion) amalga oshiradi: mijoz aniq klasslarga emas, faqat abstraksiyalarga bog'liq.
Factory ning ikki turi: Factory Method va Abstract Factory. Factory Method — klassdagi bitta metod, podklasslar obyekt yaratish uchun uni override qiladi. Abstract Factory — o'zaro bog'liq obyektlar guruhlarini yaratish uchun fabrika metodlari oilasiga ega interfeys. Ikkala variant ham bir vazifani hal qiladi: mijoz to'g'ridan-to'g'ri new MyClass() ni chaqirmaydi, balki fabrikadan o'z turi yoki parametrlari bo'yicha obyekt yaratishni so'raydi.
Factory vs new() — to'g'ridan-to'g'ri obyekt yaratish kodni aniq implementatsiya bilan qattiq bog'laydi. Factory oraliq qatlam qo'shadi: implementatsiyani o'zgartirish faqat fabrikada o'zgartirishni talab qiladi, barcha mijozlarda emas. Mobil rivojlanishda Factory ViewModel (ViewModelProvider.Factory), tarmoq mijozlari (Retrofit.create()), ro'yxat adapterlari va serializatsiya fabrikalarini yaratish uchun faol ishlatiladi. DI konteynerlari (Dagger, Koin) avtomatik ravishda fabrikalar yaratadi.
Factory Method — protokolda yoki abstrakt klassda e'lon qilingan, ma'lum turdagi obyektni qaytaradigan metod. Podklasslar bu metodni amalga oshirib, aniq instansiyalar yaratadi. Swift da bu protokolda static method yoki bazaviy klassdagi metod bo'lishi mumkin. Kotlin da — companion object bilan fabrika metodi yoki abstrakt klassdagi open fun. Pattern parserlar, xato fabrikalari va so'rov builderlarini yaratish uchun keng qo'llaniladi.
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()
}
}
}
// Foydalanish
let gateway = PaymentFactory.create(type: .stripe)
Kotlin versiyasi Factory Method turlarni cheklash uchun companion object yoki sealed class dan foydalanadi. Sealed class when tarmog'i barcha mumkin bo'lgan turlarni qamrab olishini kafolatlaydi — kompilyator to'liqlikni tekshiradi. Bu fabrika build flavour yoki konfiguratsiyaga qarab turli Repository yoki DataSource implementatsiyalarini yaratadigan Android loyihalari uchun xos.
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 — aniq klasslarini ko'rsatmasdan o'zaro bog'liq yoki o'zaro ta'sir qiluvchi obyektlar oilalarini yaratish patterni. Mijoz oilaning har bir mahsulotini yaratish uchun metodlarni belgilaydigan abstrakt fabrika interfeysi bilan ishlaydi. Aniq fabrika interfeysni amalga oshiradi va ma'lum variantdagi obyektlarni yaratadi. Masalan, iOS uchun UI komponent fabrikasi UIButton, UILabel, UITableView yaratadi, Android uchun esa — Button, TextView, RecyclerView.
Abstract Factory vs Factory Method — Factory Method meros orqali bir turdagi obyekt yaratadi, Abstract Factory kompozitsiya orqali obyektlar oilasini yaratadi. Factory Method podklasslarda override qilinadi, Abstract Factory protokol orqali bir nechta fabrika metodini taqdim etadi. Abstract Factory ko'pincha bir nechta Factory Method ni o'z ichiga oladi. Mobil rivojlanishda Abstract Factory platformaga bog'liq komponentlar, mavzu dizaynlari va ma'lumotlar bazasi fabrikalari uchun ishlatiladi.
| Xarakteristika | Factory Method | Abstract Factory |
|---|---|---|
| Mahsulot soni | Bitta | Oila (bir nechta) |
| Mexanizm | Meros (override) | Kompozitsiya (protocol/interface) |
| iOS misoli | PaymentFactory.create() | UIComponentFactory iOS/Android uchun |
| Android misoli | ViewModelProvider.Factory | ThemeFactory: tugmalar, matnlar, kartalar yaratish |
| Moslashuvchanlik | Oddiy podklass almashtirish | Oilani to'liq almashtirish |
Real holat Android da Abstract Factory — yagona DatabaseFactory interfeysi orqali turli ma'lumotlar bazasi turlarini (SQLite vs Room) amalga oshirish. Fabrika DAO obyektlari, migratsiyalar va bog'lanish havzalarini yaratadi. iOS da — turli muhitlar (Development/Staging/Production) uchun xizmat fabrikasi. Abstract Factory to'g'ridan-to'g'ri kamdan-kam ishlatiladi — uning vazifalarini DI konteynerlari (Dagger Module, Swinject Assembly) o'z zimmasiga oladi.
Swift Factory protokollar va statik metodlar orqali amalga oshiriladi. Factory protokoli abstrakt turni qaytaradigan create() metodini e'lon qiladi. Aniq fabrika protokolni amalga oshiradi va kerakli obyektlarni yaratadi. Swift oddiy holatlar uchun alohida fabrika klassini talab qilmaydi — enum yoki struct dagi statik metod yetarli. Murakkab stsenariylar uchun DI orqali kiritish bilan Factory protokoli ishlatiladi.
iOS SDK da Factory — ko'plab tizim fabrikalari: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:). Dasturchilar ViewController (StoryboardFactory), xizmatlar (ServiceFactory) va ma'lumot modellari uchun fabrikalar yaratadi. Factory Method VIPER va Clean Swift arxitekturalarida ekran modullarini yaratish uchun faol ishlatiladi.
Factory + DI — zamonaviy alternativ: DI konteyneri (Swinject, Factory) ro'yxatdan o'tgan turlar uchun avtomatik fabrikalar yaratadi. Konteyner obyekt yaratish retseptlarini saqlaydi va bog'liqliklarni hal qiladi. Factory kutubxonasi (github.com/hmlongco/Factory) avtomatik kiritish uchun @Injected(.service) dan foydalanadi. DI fabrikalari bir qator bilan butun modulni almashtirish orqali tekshiriladi: container.register { MockService() }.
Android Factory — klassik misol: ViewModelProvider.Factory parametrlar bilan ViewModel yaratish uchun. Google ViewModel fabrikalarini avtomatik yaratish uchun Hilt dan foydalanishni tavsiya qiladi — @HiltViewModel annotatsiyasi Factory ni avtomatik yaratadi. Oddiy obyektlar uchun create() yoki invoke() metodi bilan companion object ishlatiladi. Kotlin da invoke operatori fabrikani funksiya kabi chaqirishga imkon beradi: Factory(param).
Jetpack Compose da Factory — fabrikalar holat va effektlarni yaratish uchun ishlatiladi. remember { Factory.create() } birinchi renderda obyekt yaratadi va uni composable umri davomida saqlaydi. Compose da ViewModel viewModel() orqali yaratiladi — bu Hilt tomonidan boshqariladigan fabrika. Compose da fabrikalar kamroq aniq namoyon bo'ladi, chunki DI va Compose StateManager obyekt yaratishni o'z zimmasiga oladi.
Factory vs Hilt — Dagger/Hilt kompilyatsiya bosqichida avtomatik fabrikalar yaratadi. @Module + @Provides Factory Method ni, @Binds Abstract Factory ni almashtiradi. Qo'lda yozilgan fabrikalar ish vaqtida dinamik implementatsiya tanlash uchun (A/B test, feature flag) dolzarb bo'lib qoladi. Statik bog'liqliklar uchun Hilt obyekt yaratishni to'liq avtomatlashtiradi — dasturchi faqat interfeys va annotatsiyalarni yozadi.
Tez-tez so'raladigan savollar
Factory Method meros orqali bir turdagi obyekt yaratadi — podklass fabrika metodini override qiladi. Abstract Factory kompozitsiya orqali obyektlar oilasini yaratadi — fabrika interfeysi bir nechta mahsulot uchun metodlarni e'lon qiladi. Factory Method soddaroq, Abstract Factory platformaga bog'liq yoki tematik komponentlar uchun moslashuvchanroq.
Factory ish vaqtida dinamik implementatsiya tanlash uchun asoslangan (A/B testlar, feature flaglar, turli tariflar uchun turli API). DI (Hilt, Dagger, Koin) statik bog'liqliklar uchun afzal — yaratish va kiritishni avtomatlashtiradi. Factory va DI bir-birini istisno qilmaydi: DI modul ichida Factory dan foydalanishi mumkin.
Factory protokol orqali fabrikani almashtirish bilan testlanadi. Testda bir xil protokolni amalga oshiradigan va mock-obyektlar qaytaradigan TestFactory yaratiladi. Statik Factory metodlari uchun testlash qiyinroq — DI konteyneri yoki swizzling talab qilinadi. Test qilinishini saqlash uchun har doim Factory uchun protokol ishlatish tavsiya etiladi.
ViewModelProvider.Factory — Jetpack dan maxsus parametrlar bilan ViewModel yaratishga imkon beruvchi interfeys. Fabrikasiz ViewModel refleksiya orqali yaratiladi va faqat bo'sh konstruktorga ega bo'lishi mumkin. Factory parametrlarni (repository, application context) qabul qiladi va ularni ViewModel konstruktoriga uzatadi. Hilt @HiltViewModel uchun Factory ni avtomatik yaratadi.
Factory Open-Closed prinsipini amalga oshiradi: tizim kengayish uchun ochiq (yangi implementatsiya fabrikaga qo'shiladi), lekin o'zgartirish uchun yopiq (mijoz kodi o'zgarmaydi). Yangi mahsulot turini qo'shish faqat fabrikada o'zgarishni talab qiladi, barcha mijozlarda emas. Bu Factory ning to'g'ridan-to'g'ri obyekt yaratishdan asosiy ustunligidir.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.