Factory: a Factory Method és Abstract Factory minta lényege

Szerző: IT Sectr Megjelenés: 2026-02-17 Olvasási idő: 7 perc

Factory — egy létrehozási minta, amely az objektumok létrehozását gyári metódusokra delegálja. Mobilfejlesztésben a Factory Method és Abstract Factory a ViewModel, NetworkClient, Repository és más függőségek létrehozására szolgál. Factory elkülöníti a példányosítás logikáját, megkönnyítve a megvalósítások cseréjét. Bővebben — a Refactoring Guru: Factory Method oldalon.

Főbb pontok

  • Factory — létrehozási minta objektumok létrehozására konkrét osztály megadása nélkül
  • Factory Method — metódus a szuperosztályban, amelyet az alosztályok felülírnak az objektumlétrehozáshoz
  • Abstract Factory — interfész egymással összefüggő objektumcsaládok létrehozásához
  • Tesztelés — a gyárak megkönnyítik a megvalósítások mock-objektumokkal való cseréjét a tesztekben
  • DI vs Factory — a Dependency Injection felváltja a gyárakat a modern alkalmazásokban

Mi az a Factory: az objektumlétrehozási minta lényege?

Factory — egy létrehozási tervezési minta a GoF katalógusból. A fő ötlet: az objektumlétrehozás logikájának kiszervezése a klienskódból egy külön metódusba vagy osztályba. A kliens egy interfésszel vagy absztrakt osztállyal dolgozik, a konkrét megvalósítást pedig a gyár hozza létre. Ez megvalósítja a függőség megfordításának elvét (Dependency Inversion): a kliens nem függ konkrét osztályoktól, csak absztrakcióktól.

Két változata a Factory-nak: Factory Method és Abstract Factory. Factory Method — egy metódus az osztályban, amelyet az alosztályok felülírnak objektumok létrehozásához. Abstract Factory — egy interfész gyári metódusok családjával egymással összefüggő objektumcsoportok létrehozásához. Mindkét változat ugyanazt a problémát oldja meg: a kliens nem hívja közvetlenül a new MyClass()-t, hanem megkéri a gyárat, hogy hozzon létre egy objektumot a típusa vagy paraméterei alapján.

Factory vs new() — az objektumok közvetlen létrehozása szorosan a kódot egy konkrét megvalósításhoz köti. A Factory hozzáad egy közbenső réteget: a megvalósítás cseréje csak a gyárban igényel változtatást, nem az összes kliensben. A mobilfejlesztésben a Factory-t aktívan használják ViewModel (ViewModelProvider.Factory), hálózati kliensek (Retrofit.create()), listaadapterek és szerializációs gyárak létrehozására. A DI-konténerek (Dagger, Koin) automatikusan generálnak gyárakat.

Factory Method: Swift és Kotlin példák

Factory Method — egy protokollban vagy absztrakt osztályban deklarált metódus, amely egy adott típusú objektumot ad vissza. Az alosztályok implementálják ezt a metódust, konkrét példányokat hozva létre. Swiftben ez lehet static method egy protokollban vagy metódus egy alaposztályban. Kotlinban — companion object gyári metódussal vagy open fun egy absztrakt osztályban. A mintát széles körben használják elemzők, hibagyárak és lekérdezés-építők létrehozására.

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()
        }
    }
}

// Használat
let gateway = PaymentFactory.create(type: .stripe)

Kotlin verzió Factory Method companion object vagy sealed class használ a típusok korlátozására. A sealed class garantálja, hogy a when ág az összes lehetséges típust lefedi — a fordító ellenőrzi a teljességet. Ez jellemző az Android projektekre, ahol a gyár különböző Repository vagy DataSource megvalósításokat hoz létre a build flavour vagy konfiguráció függvényében.

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: egymással összefüggő objektumcsaládok

Abstract Factory — minta egymással összefüggő vagy egymástól függő objektumcsaládok létrehozására a konkrét osztályok megadása nélkül. A kliens az absztrakt gyár interfészével dolgozik, amely meghatározza a család egyes termékeinek létrehozási metódusait. A konkrét gyár implementálja az interfészt, és egy adott variáns objektumait hozza létre. Például egy UI-komponensek gyára iOS-hez UIButton, UILabel, UITableView objektumokat hoz létre, Androidhoz pedig — Button, TextView, RecyclerView objektumokat.

Abstract Factory vs Factory Method — a Factory Method egy típusú objektumot hoz létre öröklődéssel, az Abstract Factory objektumcsaládot hoz létre kompozícióval. A Factory Method-ot az alosztályok írják felül, az Abstract Factory több gyári metódust biztosít egy protokollon keresztül. Az Abstract Factory gyakran több Factory Method-ot tartalmaz. Mobilfejlesztésben az Abstract Factory-t platformfüggő komponensekhez, témákhoz és adatbázis-gyárakhoz használják.

JellemzőFactory MethodAbstract Factory
Termékek számaEgyCsalád (több)
MechanizmusÖröklődés (override)Kompozíció (protocol/interface)
Példa iOSPaymentFactory.create()UIComponentFactory iOS/Android rendszerhez
Példa AndroidViewModelProvider.FactoryThemeFactory: gombok, szövegek, kártyák létrehozása
RugalmasságEgyszerű alosztálycsereTeljes családcsere

Valós eset Abstract Factory Androidban — különböző adatbázistípusok (SQLite vs Room) implementálása egységes DatabaseFactory interfészen keresztül. A gyár DAO-objektumokat, migrációkat és kapcsolati poolokat hoz létre. iOS-ben — szolgáltatásgyár különböző környezetekhez (Development/Staging/Production). Az Abstract Factory-t ritkán használják közvetlenül — funkcióit a DI-konténerek (Dagger Module, Swinject Assembly) veszik át.

Factory iOS-ben: protokollok és statikus metódusok

Swift Factory protokollokon és statikus metódusokon keresztül valósul meg. A Factory protokoll deklarálja a create() metódust, amely egy absztrakt típust ad vissza. A konkrét gyár implementálja a protokollt, és létrehozza a szükséges objektumokat. A Swift nem igényel külön gyárosztályt egyszerű esetekben — elég egy statikus metódus egy enum-ban vagy struct-ban. Összetett forgatókönyvekhez a Factory protokollt használják DI-n keresztüli injektálással.

Factory az iOS SDK-ban — számos rendszergyár: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:). A fejlesztők gyárakat hoznak létre ViewController (StoryboardFactory), szolgáltatások (ServiceFactory) és adatmodellek számára. A Factory Method-ot aktívan használják a VIPER és Clean Swift architektúrákban képernyőmodulok létrehozására.

Factory + DI — modern alternatíva: a DI-konténer (Swinject, Factory) automatikusan generál gyárakat a regisztrált típusokhoz. A konténer tárolja az objektumlétrehozási recepteket és feloldja a függőségeket. A Factory könyvtár (github.com/hmlongco/Factory) a @Injected(.service) használja automatikus injektáláshoz. A DI-gyárakat a teljes modul egy sorral való cseréjével tesztelik: container.register { MockService() }.

Factory Androidban: companion factory és DI-modulok

Android Factory — klasszikus példa: ViewModelProvider.Factory ViewModel létrehozásához paraméterekkel. A Google a Hilt használatát javasolja a ViewModel-gyárak automatikus generálásához — a @HiltViewModel annotáció automatikusan létrehozza a Factory-t. Egyszerű objektumokhoz a companion object használatos a create() vagy invoke() metódussal. Kotlinban az invoke operátor lehetővé teszi a gyár függvényként való meghívását: Factory(param).

Factory a Jetpack Compose-ban — a gyárakat állapotok és effektusok létrehozására használják. A remember { Factory.create() } létrehoz egy objektumot az első rendereléskor, és megőrzi azt a composable élettartama alatt. A ViewModel Compose-ban a viewModel()-en keresztül jön létre — ez egy Hilt által kezelt gyár. A Compose-ban a gyárak ritkábban jelennek meg explicit módon, mivel a DI és a Compose StateManager veszi át az objektumlétrehozást.

Factory vs Hilt — a Dagger/Hilt automatikusan generál gyárakat a fordítási fázisban. A @Module + @Provides felváltja a Factory Method-ot, a @Binds felváltja az Abstract Factory-t. A kézi gyárak továbbra is relevánsak a dinamikus implementációválasztáshoz futásidőben (A/B tesztelés, feature flag-ek). Statikus függőségek esetén a Hilt teljesen automatizálja az objektumlétrehozást — a fejlesztő csak az interfészt és az annotációkat írja.

Gyakran ismételt kérdések

Miben különbözik a Factory Method az Abstract Factory-tól?

A Factory Method egy típusú objektumot hoz létre öröklődéssel — az alosztály felülírja a gyári metódust. Az Abstract Factory objektumcsaládot hoz létre kompozícióval — a gyári interfész metódusokat deklarál több termékhez. A Factory Method egyszerűbb, az Abstract Factory rugalmasabb platformfüggő vagy tematikus komponensekhez.

Mikor használjunk Factory-t DI helyett?

A Factory indokolt a dinamikus implementációválasztáshoz futásidőben (A/B tesztek, feature flag-ek, eltérő API különböző tarifákhoz). A DI (Hilt, Dagger, Koin) előnyösebb statikus függőségekhez — automatizálja a létrehozást és az injektálást. A Factory és a DI nem zárják ki egymást: a DI használhat Factory-t egy modulon belül.

Hogyan teszteljük a Factory-t használó kódot?

A Factory-t a gyár protokollon keresztüli cseréjével teszteljük. A tesztben létrehozunk egy TestFactory-t, amely implementálja ugyanazt a protokollt és mock-objektumokat ad vissza. Statikus Factory metódusok esetén a tesztelés nehezebb — DI-konténert vagy swizzling-et igényel. Javasolt mindig protokollt használni a Factory-hoz a tesztelhetőség megőrzése érdekében.

Mi az a ViewModelProvider.Factory Androidban?

A ViewModelProvider.Factory — egy interfész a Jetpack-ből, amely lehetővé teszi ViewModel létrehozását egyedi paraméterekkel. Gyár nélkül a ViewModel reflexióval jön létre, és csak üres konstruktorral rendelkezhet. A Factory paramétereket fogad (repository, application context) és továbbítja azokat a ViewModel konstruktorának. A Hilt automatikusan generál Factory-t a @HiltViewModel számára.

Hogyan kapcsolódik a Factory a nyílt/zárt elvhez?

A Factory megvalósítja az Open-Closed elvet: a rendszer nyitott a bővítésre (új implementáció kerül a gyárba), de zárt a módosításra (a klienskód nem változik). Új terméktípus hozzáadása csak a gyárban igényel változtatást, nem az összes kliensben. Ez a Factory kulcsfontosságú előnye a közvetlen objektumlétrehozással szemben.

Összefoglalás

  • Factory — létrehozási minta objektumok létrehozására absztrakción keresztül
  • Factory Method — egy metódus, amelyet az alosztályok felülírnak
  • Abstract Factory — interfész objektumcsalád létrehozásához
  • iOS — protokollok és statikus metódusok gyárakhoz
  • Android — companion object, ViewModelProvider.Factory, Hilt
  • DI vs Factory — DI automatizálja a létrehozást, Factory dinamikus választáshoz
  • Tesztelés — Factory protokoll kötelező az implementációk cseréjéhez

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is