Factory — obyekt yaratmağı fabrik metodlarına həvalə edən yaradıcı nümunədir. Mobil inkişafda Factory Method və Abstract Factory ViewModel, NetworkClient, Repository və digər asılılıqları yaratmaq üçün istifadə olunur. Factory instansiasiya məntiqini təcrid edərək implementasiyaların dəyişdirilməsini asanlaşdırır. Ətraflı — Refactoring Guru: Factory Method.
Əsas məqamlar
Factory — GoF kataloqundan yaradıcı dizayn nümunəsi. Əsas ideya: obyekt yaratma məntiqini müştəri kodundan ayrı bir metod və ya sinifə çıxarmaq. Müştəri interfeys və ya abstrakt siniflə işləyir, konkret implementasiya isə fabrik tərəfindən yaradılır. Bu, asılılıqların tərsi prinsipini (Dependency Inversion) həyata keçirir: müştəri konkret siniflərdən deyil, yalnız abstraksiyalardan asılıdır.
Factory-nin iki növü: Factory Method və Abstract Factory. Factory Method — sinifdə alt-siniflərin obyekt yaratmaq üçün override etdiyi bir metod. Abstract Factory — bir-biri ilə əlaqəli obyekt qrupları yaratmaq üçün fabrik metodları ailəsi olan interfeys. Hər iki variant eyni məsələni həll edir: müştəri birbaşa new MyClass() çağırmır, fabrikdən öz növünə və ya parametrlərinə görə obyekt yaratmasını xahiş edir.
Factory vs new() — birbaşa obyekt yaratmaq kodu konkret implementasiya ilə sərt bağlayır. Factory bir ara qat əlavə edir: implementasiyanın dəyişdirilməsi yalnız fabrikdə dəyişiklik tələb edir, bütün müştərilərdə yox. Mobil inkişafda Factory ViewModel (ViewModelProvider.Factory), şəbəkə müştəriləri (Retrofit.create()), siyahı adapterləri və serializasiya fabrikləri yaratmaq üçün fəal istifadə olunur. DI konteynerləri (Dagger, Koin) avtomatik olaraq fabriklər yaradır.
Factory Method — protokolda və ya abstrakt sinifdə müəyyən tipli obyekt qaytaran metod. Alt-siniflər bu metodu həyata keçirərək konkret instansiyalar yaradır. Swift-də bu protokolda static method və ya əsas sinifdə metod ola bilər. Kotlin-də — companion object ilə fabrik metodu və ya abstrakt sinifdə open fun. Nümunə geniş şəkildə parserlər, xəta fabrikləri və sorğu builderları yaratmaq üçün istifadə olunur.
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()
}
}
}
// İstifadə
let gateway = PaymentFactory.create(type: .stripe)
Kotlin versiyası Factory Method tipləri məhdudlaşdırmaq üçün companion object və ya sealed class istifadə edir. Sealed class when budağının bütün mümkün tipləri əhatə etdiyinə zəmanət verir — kompilyator tamlığı yoxlayır. Bu, fabrikin build flavour və ya konfiqurasiyadan asılı olaraq müxtəlif Repository və ya DataSource implementasiyaları yaratdığı Android layihələri üçün xarakterikdir.
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 — konkret siniflərini göstərmədən bir-biri ilə əlaqəli və ya qarşılıqlı asılı obyekt ailələri yaratmaq nümunəsi. Müştəri ailənin hər bir məhsulunu yaratmaq üçün metodlar təyin edən abstrakt fabrik interfeysi ilə işləyir. Konkret fabrik interfeysi həyata keçirir və müəyyən variantın obyektlərini yaradır. Məsələn, iOS üçün UI komponent fabriki UIButton, UILabel, UITableView yaradır, Android üçün isə — Button, TextView, RecyclerView.
Abstract Factory vs Factory Method — Factory Method vərəsəliklə bir tip obyekt yaradır, Abstract Factory kompozisiya ilə obyekt ailəsi yaradır. Factory Method alt-siniflərdə override edilir, Abstract Factory protokol vasitəsilə bir neçə fabrik metodu təqdim edir. Abstract Factory tez-tez bir neçə Factory Method ehtiva edir. Mobil inkişafda Abstract Factory platformadan asılı komponentlər, mövzu dizaynları və məlumat bazası fabrikləri üçün istifadə olunur.
| Xarakteristika | Factory Method | Abstract Factory |
|---|---|---|
| Məhsul sayı | Bir | Ailə (bir neçə) |
| Mexanizm | Vərəsəlik (override) | Kompozisiya (protocol/interface) |
| iOS nümunəsi | PaymentFactory.create() | UIComponentFactory iOS/Android üçün |
| Android nümunəsi | ViewModelProvider.Factory | ThemeFactory: düymələr, mətnlər, kartlar yaratma |
| Çeviklik | Sadə alt-sinif dəyişdirmə | Ailənin tam dəyişdirilməsi |
Real nümunə Android-də Abstract Factory — vahid DatabaseFactory interfeysi vasitəsilə müxtəlif məlumat bazası növlərinin (SQLite vs Room) tətbiqi. Fabrik DAO obyektləri, miqrasiyalar və əlaqə hovuzları yaradır. iOS-da — müxtəlif mühitlər (Development/Staging/Production) üçün xidmət fabriki. Abstract Factory birbaşa nadir hallarda istifadə olunur — onun funksiyalarını DI konteynerləri (Dagger Module, Swinject Assembly) öz üzərinə götürür.
Swift Factory protokollar və statik metodlar vasitəsilə həyata keçirilir. Factory protokolu abstrakt tip qaytaran create() metodu elan edir. Konkret fabrik protokolu həyata keçirir və lazım olan obyektləri yaradır. Swift sadə hallar üçün ayrıca fabrik sinifi tələb etmir — enum və ya struct-da statik metod kifayətdir. Mürəkkəb ssenarilər üçün DI ilə vurma ilə Factory protokolu istifadə olunur.
iOS SDK-da Factory — çoxlu sistem fabrikləri: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:). Tərtibatçılar ViewController (StoryboardFactory), xidmətlər (ServiceFactory) və məlumat modelləri üçün fabriklər yaradır. Factory Method VIPER və Clean Swift arxitekturalarında ekran modulları yaratmaq üçün fəal istifadə olunur.
Factory + DI — müasir alternativ: DI konteyneri (Swinject, Factory) qeydiyyatdan keçmiş tiplər üçün avtomatik fabriklər yaradır. Konteyner obyekt yaratma reseptlərini saxlayır və asılılıqları həll edir. Factory kitabxanası (github.com/hmlongco/Factory) avtomatik vurma üçün @Injected(.service) istifadə edir. DI fabrikləri bir sətirlə bütün modulu əvəz etməklə test edilir: container.register { MockService() }.
Android Factory — klassik nümunə: ViewModelProvider.Factory parametrlərlə ViewModel yaratmaq üçün. Google ViewModel fabriklərinin avtomatik yaradılması üçün Hilt istifadəsini tövsiyə edir — @HiltViewModel annotasiyası Factory-ni avtomatik yaradır. Sadə obyektlər üçün create() və ya invoke() metodu ilə companion object istifadə olunur. Kotlin-də invoke operatoru fabriki funksiya kimi çağırmağa imkan verir: Factory(param).
Jetpack Compose-da Factory — fabriklər vəziyyət və effektlər yaratmaq üçün istifadə olunur. remember { Factory.create() } ilk render zamanı obyekt yaradır və onu composable ömrü boyu saxlayır. Compose-da ViewModel viewModel() vasitəsilə yaradılır — bu Hilt tərəfindən idarə olunan fabrikdir. Compose-da fabriklər daha az aşkar şəkildə rast gəlinir, çünki DI və Compose StateManager obyekt yaratmanı öz üzərinə götürür.
Factory vs Hilt — Dagger/Hilt kompilyasiya mərhələsində avtomatik fabriklər yaradır. @Module + @Provides Factory Method-u, @Binds Abstract Factory-ni əvəz edir. Əl ilə yazılmış fabriklər icra zamanı dinamik implementasiya seçimi üçün aktual qalır (A/B testi, funksiya bayraqları). Statik asılılıqlar üçün Hilt obyekt yaratmanı tam avtomatlaşdırır — tərtibatçı yalnız interfeys və annotasiyalar yazır.
Tez-tez verilən suallar
Factory Method vərəsəliklə bir tip obyekt yaradır — alt-sinif fabrik metodunu override edir. Abstract Factory kompozisiya ilə obyekt ailəsi yaradır — fabrik interfeysi bir neçə məhsul üçün metodlar elan edir. Factory Method daha sadədir, Abstract Factory platformadan asılı və ya tematik komponentlər üçün daha çevikdir.
Factory icra zamanı dinamik implementasiya seçimi üçün əsaslandırılmışdır (A/B testləri, funksiya bayraqları, müxtəlif tariflər üçün fərqli API). DI (Hilt, Dagger, Koin) statik asılılıqlar üçün daha üstündür — yaratma və vurmanı avtomatlaşdırır. Factory və DI bir-birini istisna etmir: DI modul daxilində Factory istifadə edə bilər.
Factory protokol vasitəsilə fabriki əvəz etməklə test edilir. Testdə eyni protokolu həyata keçirən və mock-obyektlər qaytaran TestFactory yaradılır. Statik Factory metodları üçün test etmək daha çətindir — DI konteyneri və ya swizzling tələb olunur. Test edilə bilənliyi qorumaq üçün həmişə Factory üçün protokoldan istifadə etmək tövsiyə olunur.
ViewModelProvider.Factory — Jetpack-dən fərdi parametrlərlə ViewModel yaratmağa imkan verən interfeys. Fabrik olmadan ViewModel refleksiya vasitəsilə yaradılır və yalnız boş konstruktora malik ola bilər. Factory parametrləri (repozitori, application context) qəbul edir və onları ViewModel konstruktoruna ötürür. Hilt @HiltViewModel üçün Factory-ni avtomatik yaradır.
Factory Open-Closed prinsipini həyata keçirir: sistem genişlənməyə açıqdır (yeni implementasiya fabrikə əlavə olunur), lakin dəyişdirilməyə qapalıdır (müştəri kodu dəyişmir). Yeni məhsul tipinin əlavə edilməsi yalnız fabrikdə dəyişiklik tələb edir, bütün müştərilərdə yox. Bu, Factory-nin birbaşa obyekt yaratma qarşısında əsas üstünlüyüdür.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun