Factory: kärnan i mönstret Factory Method och Abstract Factory

Författare: IT Sectr Publicerad: 2026-02-17 Lästid: 7 min

Factory — ett skapandemönster som delegerar objektsskapande till fabriksmetoder. Inom mobil utveckling används Factory Method och Abstract Factory för att skapa ViewModel, NetworkClient, Repository och andra beroenden. Factory isolerar instansieringslogiken och förenklar utbytet av implementationer. Mer — på Refactoring Guru: Factory Method.

Huvudpunkter

  • Factory — skapandemönster för att skapa objekt utan att ange specifik klass
  • Factory Method — metod i superklass, åsidosatt i subklasser för att skapa objekt
  • Abstract Factory — gränssnitt för att skapa familjer av sammanlänkade objekt
  • Testning — fabriker förenklar utbyte av implementationer mot mock-objekt i tester
  • DI vs Factory — Dependency Injection ersätter fabriker i moderna applikationer

Vad är Factory: kärnan i mönstret för att skapa objekt?

Factory — ett skapande designmönster från GoF-katalogen. Huvudidén: flytta logiken för att skapa objekt från klientkoden till en separat metod eller klass. Klienten arbetar med ett gränssnitt eller en abstrakt klass, och den konkreta implementationen skapas av fabriken. Detta implementerar principen om beroendeinversion (Dependency Inversion): klienten är inte beroende av konkreta klasser, utan endast av abstraktioner.

Två varianter Factory: Factory Method och Abstract Factory. Factory Method — en metod i en klass som subklasser åsidosätter för att skapa objekt. Abstract Factory — ett gränssnitt med en familj av fabriksmetoder för att skapa grupper av sammanlänkade objekt. Båda varianterna löser samma problem: klienten anropar inte direkt new MyClass(), utan ber fabriken att skapa ett objekt baserat på dess typ eller parametrar.

Factory vs new() — direkt objektsskapande binder koden hårt till en konkret implementation. Factory lägger till ett mellanlager: ändring av implementation kräver ändring endast i fabriken, inte i alla klienter. Inom mobil utveckling används Factory aktivt för att skapa ViewModel (ViewModelProvider.Factory), nätverksklienter (Retrofit.create()), listadaptrar och serialiseringsfabriker. DI-containrar (Dagger, Koin) genererar automatiskt fabriker.

Factory Method: Swift och Kotlin exempel

Factory Method — en metod deklarerad i ett protokoll eller en abstrakt klass som returnerar ett objekt av en specifik typ. Subklasser implementerar denna metod och skapar konkreta instanser. I Swift kan detta vara en static method i ett protokoll eller en metod i en basklass. I Kotlin — companion object med en fabriksmetod eller open fun i en abstrakt klass. Mönstret används i stor utsträckning för att skapa parsers, feltfabriker och frågebyggare.

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

// Användning
let gateway = PaymentFactory.create(type: .stripe)

Kotlin-version Factory Method använder companion object eller sealed class för att begränsa typer. Sealed class garanterar att when-grenen täcker alla möjliga typer — kompilatorn kontrollerar fullständigheten. Detta är typiskt för Android-projekt, där fabriken skapar olika implementationer av Repository eller DataSource beroende på build flavour eller konfiguration.

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: familjer av sammanlänkade objekt

Abstract Factory — ett mönster för att skapa familjer av sammanlänkade eller ömsesidigt beroende objekt utan att specificera deras konkreta klasser. Klienten arbetar med gränssnittet för den abstrakta fabriken, som definierar metoder för att skapa varje produkt i familjen. Den konkreta fabriken implementerar gränssnittet och skapar objekt av en specifik variant. Till exempel skapar en fabrik av UI-komponenter för iOS UIButton, UILabel, UITableView, och för Android — Button, TextView, RecyclerView.

Abstract Factory vs Factory Method — Factory Method skapar en typ av objekt genom arv, Abstract Factory skapar en familj av objekt genom komposition. Factory Method åsidosätts i subklasser, Abstract Factory tillhandahåller flera fabriksmetoder genom ett protokoll. Abstract Factory innehåller ofta flera Factory Method. Inom mobil utveckling används Abstract Factory för plattformsberoende komponenter, teman och databasfabriker.

EgenskapFactory MethodAbstract Factory
Antal produkterEnFamilj (flera)
MekanismArv (override)Komposition (protocol/interface)
Exempel iOSPaymentFactory.create()UIComponentFactory för iOS/Android
Exempel AndroidViewModelProvider.FactoryThemeFactory: skapa knappar, texter, kort
FlexibilitetEnkelt subklassbyteFullständigt familjebyte

Verkligt fall Abstract Factory i Android — implementering av olika databastyper (SQLite vs Room) genom ett enhetligt DatabaseFactory-gränssnitt. Fabriken skapar DAO-objekt, migreringar och anslutningspooler. I iOS — en servicefabrik för olika miljöer (Development/Staging/Production). Abstract Factory används sällan direkt — dess funktioner övertas av DI-containrar (Dagger Module, Swinject Assembly).

Factory i iOS: protokoll och statiska metoder

Swift Factory implementeras genom protokoll och statiska metoder. Protokollet Factory deklarerar metoden create() som returnerar en abstrakt typ. Den konkreta fabriken implementerar protokollet och skapar nödvändiga objekt. Swift kräver ingen separat fabriksklass för enkla fall — en statisk metod i enum eller struct räcker. För komplexa scenarier används Factory-protokollet med injicering genom DI.

Factory i iOS SDK — många systemfabriker: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:). Utvecklare skapar fabriker för ViewController (StoryboardFactory), för tjänster (ServiceFactory) och för datamodeller. Factory Method används aktivt i VIPER och Clean Swift-arkitekturer för att skapa skärmmoduler.

Factory + DI — modernt alternativ: DI-container (Swinject, Factory) genererar automatiskt fabriker för registrerade typer. Containern lagrar recept för objektsskapande och löser beroenden. Factory-biblioteket (github.com/hmlongco/Factory) använder @Injected(.service) för automatisk injicering. DI-fabriker testas genom att ersätta hela modulen med en rad: container.register { MockService() }.

Factory i Android: companion factory och DI-moduler

Android Factory — klassiskt exempel: ViewModelProvider.Factory för att skapa ViewModel med parametrar. Google rekommenderar att använda Hilt för automatisk generering av ViewModel-fabriker — @HiltViewModel-annotationen skapar Factory automatiskt. För enkla objekt används companion object med metoden create() eller invoke(). I Kotlin tillåter operatorn invoke att anropa fabriken som en funktion: Factory(param).

Factory i Jetpack Compose — fabriker används för att skapa tillstånd och effekter. remember { Factory.create() } skapar ett objekt vid första renderingen och behåller det under composable-objektets livstid. ViewModel i Compose skapas via viewModel() — detta är en fabrik som hanteras av Hilt. I Compose förekommer fabriker mindre explicit eftersom DI och Compose StateManager tar över objektsskapande.

Factory vs Hilt — Dagger/Hilt genererar automatiskt fabriker under kompileringsfasen. @Module + @Providers ersätter Factory Method, @Binds ersätter Abstract Factory. Manuella fabriker förblir relevanta för dynamiskt implementationsval under körning (A/B-testning, feature flags). För statiska beroenden automatiserar Hilt helt objektsskapandet — utvecklaren skriver bara gränssnittet och annotationerna.

Vanliga frågor

Vad är skillnaden mellan Factory Method och Abstract Factory?

Factory Method skapar en typ av objekt genom arv — subklassen åsidosätter fabriksmetoden. Abstract Factory skapar en familj av objekt genom komposition — fabriksgränssnittet deklarerar metoder för flera produkter. Factory Method är enklare, Abstract Factory är mer flexibel för plattformsberoende eller tematiska komponenter.

När ska man använda Factory istället för DI?

Factory är motiverad för dynamiskt implementationsval under körning (A/B-tester, feature flags, olika API för olika taxor). DI (Hilt, Dagger, Koin) är att föredra för statiska beroenden — det automatiserar skapande och injicering. Factory och DI utesluter inte varandra: DI kan använda Factory inuti en modul.

Hur testar man kod som använder Factory?

Factory testas genom att byta ut fabriken via ett protokoll. I testet skapas en TestFactory som implementerar samma protokoll och returnerar mock-objekt. För statiska Factory-metoder är testning svårare — det kräver en DI-container eller swizzling. Det rekommenderas att alltid använda protokoll för Factory för att bevara testbarheten.

Vad är ViewModelProvider.Factory i Android?

ViewModelProvider.Factory — ett gränssnitt från Jetpack som gör det möjligt att skapa ViewModel med anpassade parametrar. Utan fabrik skapas ViewModel genom reflektion och kan endast ha en tom konstruktor. Factory tar emot parametrar (repository, application context) och skickar dem till ViewModel-konstruktorn. Hilt genererar Factory automatiskt för @HiltViewModel.

Hur hänger Factory ihop med principen om öppen/sluten?

Factory implementerar Open-Closed-principen: systemet är öppet för utökning (ny implementation läggs till i fabriken), men slutet för modifiering (klientkoden ändras inte). Tillägg av en ny produkttyp kräver ändring endast i fabriken, inte i alla klienter. Detta är den viktigaste fördelen med Factory jämfört med direkt objektsskapande.

Sammanfattning

  • Factory — skapandemönster för att skapa objekt genom abstraktion
  • Factory Method — en metod som åsidosätts i subklasser
  • Abstract Factory — gränssnitt för att skapa en familj av objekt
  • iOS — protokoll och statiska metoder för fabriker
  • Android — companion object, ViewModelProvider.Factory, Hilt
  • DI vs Factory — DI automatiserar skapande, Factory för dynamiskt val
  • Testning — Factory-protokoll är obligatoriskt för utbyte av implementationer

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också