Factory: Factory Method ve Abstract Factory desenlerinin özü

Yazar: IT Sectr Yayınlanma: 2026-02-17 Okuma süresi: 7 dk

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 — belirli bir sınıf belirtmeden nesne oluşturmak için yaratımsal desen
  • Factory Method — üst sınıfta bir yöntem, alt sınıflarda nesne oluşturmak için geçersiz kılınır
  • Abstract Factory — ilişkili nesne aileleri oluşturmak için bir arayüz
  • Test — fabrikalar, testlerde uygulamaları mock nesnelerle değiştirmeyi basitleştirir
  • DI vs Factory — Bağımlılık Enjeksiyonu modern uygulamalarda fabrikaların yerini alır

Factory Nedir: nesne oluşturma deseninin özü?

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: Swift ve Kotlin örnekleri

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.

swift
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.

kotlin
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: ilişkili nesne aileleri

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.

ÖzellikFactory MethodAbstract Factory
Ürün sayısıBirAile (birden çok)
MekanizmaKalıtım (override)Kompozisyon (protokol/arayüz)
iOS örneğiPaymentFactory.create()iOS/Android için UIComponentFactory
Android örneğiViewModelProvider.FactoryThemeFactory: düğmeler, metinler, kartlar oluşturma
EsneklikBasit alt sınıf değişimiTam 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.

iOS'ta Factory: protokoller ve statik yöntemler

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'de Factory: companion factory ve DI modülleri

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, Abstract Factory'den nasıl farklıdır?

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.

DI yerine Factory ne zaman kullanılmalı?

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 kullanan kod nasıl test edilir?

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.

Android'de ViewModelProvider.Factory nedir?

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ı Prensibi ile nasıl ilişkilidir?

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

  • Factory — soyutlama yoluyla nesne oluşturmak için yaratımsal desen
  • Factory Method — alt sınıflarda geçersiz kılınan tek yöntem
  • Abstract Factory — bir nesne ailesi oluşturmak için arayüz
  • iOS — fabrikalar için protokoller ve statik yöntemler
  • Android — companion object, ViewModelProvider.Factory, Hilt
  • DI vs Factory — DI oluşturmayı otomatikleştirir, Factory dinamik seçim için
  • Test — uygulamaları değiştirmek için Factory protokolü zorunludur

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.

Projeyi tartış

Ayrıca okuyun