Factory — nesne oluşturmayı fabrika yöntemlerine devreden bir yaratımsal desendir. Mobil geliştirmede, Factory Method ve Abstract Factory, ViewModel, NetworkClient, Repository ve diğer bağımlılıkları oluşturmak için kullanılır. Factory örnekleme mantığını izole eder, uygulama değişimini basitleştirir. Daha fazla ayrıntı — Refactoring Guru: Factory Method'da.
Önemli Noktalar
Factory — GoF kataloğundan bir yaratımsal tasarım deseni. Ana fikir: nesne oluşturma mantığını istemci kodundan ayrı bir yönteme veya sınıfa taşımak. İstemci bir arayüz veya soyut sınıfla çalışırken, somut uygulama fabrika tarafından oluşturulur. Bu, Bağımlılığı Tersine Çevirme ilkesini uygular: istemci somut sınıflara değil, yalnızca soyutlamalara bağımlıdır.
İki çeşidi Factory: Factory Method ve Abstract Factory. Factory Method — alt sınıfların nesne oluşturmak için geçersiz kıldığı bir sınıftaki tek yöntem. Abstract Factory — ilişkili nesne grupları oluşturmak için bir fabrika yöntemleri ailesine sahip arayüz. Her iki varyant da aynı sorunu çözer: istemci doğrudan new MyClass() çağırmaz, fabrikadan türüne veya parametrelerine göre bir nesne oluşturmasını ister.
Factory vs new() — doğrudan nesne oluşturma, kodu somut bir uygulamaya sıkıca bağlar. Factory bir katman ekler: uygulama değişikliği, tüm istemcilerde değil yalnızca fabrikada düzenleme gerektirir. Mobil geliştirmede, Factory aktif olarak ViewModel (ViewModelProvider.Factory), ağ istemcileri (Retrofit.create()), liste bağdaştırıcıları ve serileştirme fabrikaları oluşturmak için kullanılır. DI konteynerleri (Dagger, Koin) otomatik olarak fabrikalar üretir.
Factory Method — bir protokol veya soyut sınıfta bildirilen, belirli bir türde nesne döndüren yöntemdir. Alt sınıflar yöntemi uygulayarak somut örnekler oluşturur. Swift'te, bir protokolde statik yöntem veya temel sınıfta yöntem olabilir. Kotlin'de — bir fabrika yöntemiyle companion object veya soyut sınıfta open fun. Desen, ayrıştırıcılar, hata fabrikaları ve sorgu oluşturucular oluşturmak için yaygın olarak kullanılır.
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()
}
}
}
// Kullanım
let gateway = PaymentFactory.create(type: .stripe)
Kotlin versiyonu Factory Method, türleri sınırlamak için companion object veya sealed class kullanır. Sealed class, when dalının tüm olası türleri kapsamasını sağlar — derleyici bütünlüğü kontrol eder. Bu, fabrikanın build flavour veya yapılandırmaya bağlı olarak farklı Repository veya DataSource uygulamaları oluşturduğu Android projeleri için tipiktir.
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 — somut sınıflarını belirtmeden ilişkili veya birbirine bağımlı nesne aileleri oluşturmak için bir desen. İstemci, ailenin her ürününü oluşturmak için yöntemler tanımlayan soyut fabrika arayüzüyle çalışır. Somut bir fabrika arayüzü uygular ve belirli bir varyantın nesnelerini oluşturur. Örneğin, iOS için bir UI bileşen fabrikası UIButton, UILabel, UITableView oluştururken, Android için — Button, TextView, RecyclerView oluşturur.
Abstract Factory vs Factory Method — Factory Method kalıtım yoluyla bir tür nesne oluşturur, Abstract Factory kompozisyon yoluyla bir nesne ailesi oluşturur. Factory Method alt sınıflarda geçersiz kılınır, Abstract Factory bir protokol aracılığıyla birden çok fabrika yöntemi sağlar. Abstract Factory genellikle birkaç Factory Method içerir. Mobil geliştirmede, Abstract Factory platforma bağımlı bileşenler, tema tasarımı ve veritabanı fabrikaları için kullanılır.
| Özellik | Factory Method | Abstract Factory |
|---|---|---|
| Ürün sayısı | Bir | Aile (birden çok) |
| Mekanizma | Kalıtım (override) | Kompozisyon (protokol/arayüz) |
| iOS örneği | PaymentFactory.create() | iOS/Android için UIComponentFactory |
| Android örneği | ViewModelProvider.Factory | ThemeFactory: düğmeler, metinler, kartlar oluşturma |
| Esneklik | Basit alt sınıf değişimi | Tam aile değişimi |
Gerçek durum Android'de Abstract Factory — tek bir DatabaseFactory arayüzü aracılığıyla farklı veritabanı türlerinin (SQLite vs Room) uygulanması. Fabrika, DAO nesneleri, geçişler ve bağlantı havuzları oluşturur. iOS'ta — farklı ortamlar (Development/Staging/Production) için bir hizmet fabrikası. Abstract Factory nadiren doğrudan kullanılır — işlevleri DI konteynerleri (Dagger Module, Swinject Assembly) tarafından üstlenilir.
Swift Factory protokoller ve statik yöntemler aracılığıyla uygulanır. Factory protokolü, soyut bir tür döndüren create() yöntemini bildirir. Somut bir fabrika protokolü uygular ve gerekli nesneleri oluşturur. Swift basit durumlar için ayrı bir fabrika sınıfı gerektirmez — enum veya struct'ta statik bir yöntem yeterlidir. Karmaşık senaryolar için, DI enjeksiyonlu bir Factory protokolü kullanılır.
iOS SDK'sında Factory — birçok sistem fabrikası: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:). Geliştiriciler ViewController (StoryboardFactory), hizmetler (ServiceFactory) ve veri modelleri için fabrikalar oluşturur. Factory Method, VIPER ve Clean Swift mimarilerinde ekran modülleri oluşturmak için aktif olarak kullanılır.
Factory + DI — modern bir alternatif: DI konteyneri (Swinject, Factory) kayıtlı türler için otomatik olarak fabrikalar üretir. Konteyner, nesne oluşturma tariflerini saklar ve bağımlılıkları çözer. Factory kütüphanesi (github.com/hmlongco/Factory) otomatik enjeksiyon için @Injected(.service) kullanır. DI fabrikaları, tek bir satırla tüm modül değiştirilerek test edilir: container.register { MockService() }.
Android Factory — klasik bir örnek: parametrelerle ViewModel oluşturmak için ViewModelProvider.Factory. Google, otomatik ViewModel fabrikası oluşturma için Hilt kullanılmasını önerir — @HiltViewModel notu otomatik olarak Factory oluşturur. Basit nesneler için, create() veya invoke() yöntemiyle companion object kullanılır. Kotlin'de invoke operatörü, fabrikanın bir işlev gibi çağrılmasına izin verir: Factory(param).
Jetpack Compose'ta Factory — fabrikalar durum ve efekt oluşturmak için kullanılır. remember { Factory.create() } ilk oluşturmada bir nesne oluşturur ve composable'ın ömrü boyunca korur. Compose'ta ViewModel, viewModel() aracılığıyla oluşturulur — bu Hilt tarafından yönetilen bir fabrikadır. Compose'ta fabrikalar açıkça daha az yaygındır çünkü DI ve Compose StateManager nesne oluşturmayı yönetir.
Factory vs Hilt — Dagger/Hilt derleme zamanında otomatik olarak fabrikalar üretir. @Module + @Provides, Factory Method'un yerini alır, @Binds, Abstract Factory'nin yerini alır. Manuel fabrikalar, çalışma zamanında dinamik uygulama seçimi (A/B testi, özellik bayrakları) için geçerliliğini korur. Statik bağımlılıklar için Hilt, nesne oluşturmayı tamamen otomatikleştirir — geliştirici yalnızca arayüzler ve notlar yazar.
Sıkça Sorulan Sorular
Factory Method kalıtım yoluyla bir tür nesne oluşturur — alt sınıf fabrika yöntemini geçersiz kılar. Abstract Factory kompozisyon yoluyla bir nesne ailesi oluşturur — fabrika arayüzü birden çok ürün için yöntemler bildirir. Factory Method daha basittir, Abstract Factory platforma bağımlı veya tematik bileşenler için daha esnektir.
Factory, çalışma zamanında dinamik uygulama seçimi (A/B testleri, özellik bayrakları, farklı seviyeler için farklı API) için haklıdır. DI (Hilt, Dagger, Koin) statik bağımlılıklar için tercih edilir — oluşturma ve enjeksiyonu otomatikleştirir. Factory ve DI birbirini dışlamaz: DI, bir modül içinde Factory kullanabilir.
Factory, bir protokol aracılığıyla fabrika değiştirilerek test edilir. Testte, aynı protokolü uygulayan ve mock nesneler döndüren bir TestFactory oluşturulur. Statik Factory yöntemleri için test daha karmaşıktır — bir DI konteyneri veya swizzling gerektirir. Test edilebilirliği korumak için Factory için her zaman bir protokol kullanılması önerilir.
ViewModelProvider.Factory, özel parametrelerle ViewModel oluşturmayı sağlayan Jetpack'ten bir arayüzdür. Fabrika olmadan, ViewModel yansıma yoluyla oluşturulur ve yalnızca boş bir kurucuya sahip olabilir. Factory, parametreleri (depo, uygulama bağlamı) kabul eder ve bunları ViewModel kurucusuna iletir. Hilt, @HiltViewModel için otomatik olarak Factory oluşturur.
Factory, Açık/Kapalı Prensibini uygular: sistem genişlemeye açıktır (yeni uygulama fabrikaya eklenir) ancak değişikliğe kapalıdır (istemci kodu değişmez). Yeni bir ürün türü eklemek, tüm istemcilerde değil yalnızca fabrikada düzenleme gerektirir. Bu, doğrudan nesne oluşturmaya kıyasla Factory'nin temel avantajıdır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun