Factory: diwa ng pattern ng Factory Method at Abstract Factory

May-akda: IT Sectr Nai-publish: 2026-02-17 Oras ng pagbabasa: 7 min

Factory — isang creational pattern na nagtatalaga ng paglikha ng mga bagay sa mga factory method. Sa pag-develop ng mobile, ang Factory Method at Abstract Factory ay ginagamit upang lumikha ng ViewModel, NetworkClient, Repository at iba pang dependencies. Factory naghihiwalay ng lohika ng pag-instantiate, pinapasimple ang pagpapalit ng mga implementasyon. Higit pa — sa Refactoring Guru: Factory Method.

Mga pangunahing punto

  • Factory — creational pattern para sa paglikha ng mga bagay nang hindi tinutukoy ang konkretong klase
  • Factory Method — pamamaraan sa superclass na na-override sa mga subclass para sa paglikha ng mga bagay
  • Abstract Factory — interface para sa paglikha ng mga pamilya ng magkakaugnay na bagay
  • Pagsubok — pinapasimple ng mga pabrika ang pagpapalit ng mga implementasyon ng mock-object sa mga pagsubok
  • DI vs Factory — Dependency Injection pumapalit sa mga pabrika sa mga modernong aplikasyon

Ano ang Factory: diwa ng pattern ng paglikha ng mga bagay?

Factory — isang creational design pattern mula sa katalogo ng GoF. Pangunahing ideya: ilipat ang lohika ng paglikha ng mga bagay mula sa code ng kliyente patungo sa isang hiwalay na pamamaraan o klase. Ang kliyente ay gumagana gamit ang isang interface o abstract na klase, at ang konkretong implementasyon ay nilikha ng pabrika. Ito ay nagpapatupad ng prinsipyo ng pagbabaligtad ng dependency (Dependency Inversion): ang kliyente ay hindi nakadepende sa mga konkretong klase, kundi sa mga abstraksyon lamang.

Dalawang uri ng Factory: Factory Method at Abstract Factory. Factory Method — isang pamamaraan sa klase na ni-override ng mga subclass upang lumikha ng mga bagay. Abstract Factory — isang interface na may isang pamilya ng mga factory method para sa paglikha ng mga grupo ng magkakaugnay na bagay. Ang parehong variant ay nalulutas ang parehong problema: ang kliyente ay hindi direktang tumatawag ng new MyClass(), kundi humihiling sa pabrika na lumikha ng isang bagay ayon sa uri o mga parameter nito.

Factory vs new() — ang direktang paglikha ng mga bagay ay mahigpit na nagbubuklod ng code sa isang konkretong implementasyon. Nagdaragdag ang Factory ng isang layer: ang pagpapalit ng implementasyon ay nangangailangan ng pagbabago lamang sa pabrika, hindi sa lahat ng kliyente. Sa pag-develop ng mobile, ang Factory ay aktibong ginagamit para sa paglikha ng ViewModel (ViewModelProvider.Factory), mga network client (Retrofit.create()), mga adapter ng listahan at mga factory ng serialization. Ang mga DI container (Dagger, Koin) ay awtomatikong bumubuo ng mga pabrika.

Factory Method: mga halimbawa sa Swift at Kotlin

Factory Method — isang pamamaraan na idineklara sa isang protocol o abstract na klase na nagbabalik ng isang bagay ng isang tiyak na uri. Ipinapatupad ng mga subclass ang pamamaraang ito, na lumilikha ng mga konkretong instance. Sa Swift ito ay maaaring maging static method sa isang protocol o pamamaraan sa isang base class. Sa Kotlin — companion object na may factory method o open fun sa isang abstract na klase. Ang pattern ay malawakang ginagamit para sa paglikha ng mga parser, factory ng error at mga builder ng query.

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

// Paggamit
let gateway = PaymentFactory.create(type: .stripe)

Kotlin bersyon Factory Method ay gumagamit ng companion object o sealed class upang limitahan ang mga uri. Ginagarantiya ng Sealed class na ang sangay ng when ay sumasaklaw sa lahat ng posibleng uri — sinusuri ng compiler ang pagkakumpleto. Ito ay tipikal para sa mga proyekto ng Android, kung saan ang pabrika ay lumilikha ng iba't ibang implementasyon ng Repository o DataSource depende sa build flavour o configuration.

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: mga pamilya ng magkakaugnay na bagay

Abstract Factory — pattern para sa paglikha ng mga pamilya ng magkakaugnay o magkaka-dependeng bagay nang hindi tinutukoy ang kanilang mga konkretong klase. Ang kliyente ay gumagana gamit ang interface ng abstract na pabrika na tumutukoy sa mga pamamaraan para sa paglikha ng bawat produkto ng pamilya. Ang konkretong pabrika ay nagpapatupad ng interface at lumilikha ng mga bagay ng isang tiyak na variant. Halimbawa, ang isang pabrika ng mga bahagi ng UI para sa iOS ay lumilikha ng UIButton, UILabel, UITableView, at para sa Android — Button, TextView, RecyclerView.

Abstract Factory vs Factory Method — Factory Method ay lumilikha ng isang uri ng bagay sa pamamagitan ng pamana, Abstract Factory ay lumilikha ng isang pamilya ng mga bagay sa pamamagitan ng komposisyon. Factory Method ay na-override sa mga subclass, Abstract Factory ay nagbibigay ng maraming factory method sa pamamagitan ng isang protocol. Abstract Factory ay madalas naglalaman ng maraming Factory Method. Sa pag-develop ng mobile, Abstract Factory ay ginagamit para sa mga bahaging nakadepende sa platform, mga tema at mga factory ng database.

KatangianFactory MethodAbstract Factory
Bilang ng mga produktoIsaPamilya (marami)
MekanismoPamana (override)Komposisyon (protocol/interface)
Halimbawa iOSPaymentFactory.create()UIComponentFactory para sa iOS/Android
Halimbawa AndroidViewModelProvider.FactoryThemeFactory: paglikha ng mga button, teksto, card
FlexibilitySimpleng pagpapalit ng subclassBuong pagpapalit ng pamilya

Tunay na kaso Abstract Factory sa Android — pagpapatupad ng iba't ibang uri ng database (SQLite vs Room) sa pamamagitan ng pinag-isang interface ng DatabaseFactory. Ang pabrika ay lumilikha ng mga DAO object, migrasyon at mga pool ng koneksyon. Sa iOS — pabrika ng mga serbisyo para sa iba't ibang kapaligiran (Development/Staging/Production). Abstract Factory ay bihirang ginagamit nang direkta — ang mga function nito ay ginagampanan ng mga DI container (Dagger Module, Swinject Assembly).

Factory sa iOS: mga protocol at static na pamamaraan

Swift Factory ay ipinapatupad sa pamamagitan ng mga protocol at static na pamamaraan. Ang protocol ng Factory ay nagdedeklara ng pamamaraang create() na nagbabalik ng isang abstract na uri. Ang konkretong pabrika ay nagpapatupad ng protocol at lumilikha ng mga kinakailangang bagay. Ang Swift ay hindi nangangailangan ng hiwalay na klase-pabrika para sa mga simpleng kaso — sapat na ang isang static na pamamaraan sa enum o struct. Para sa mga komplikadong sitwasyon, ginagamit ang Factory protocol na may iniksyon sa pamamagitan ng DI.

Factory sa iOS SDK — maraming system factory: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:). Ang mga developer ay lumilikha ng mga pabrika para sa ViewController (StoryboardFactory), para sa mga serbisyo (ServiceFactory) at para sa mga modelo ng data. Factory Method ay aktibong ginagamit sa mga arkitektura ng VIPER at Clean Swift para sa paglikha ng mga module ng screen.

Factory + DI — modernong alternatibo: DI container (Swinject, Factory) ay awtomatikong bumubuo ng mga pabrika para sa mga nakarehistrong uri. Ang container ay nag-iimbak ng mga recipe ng paglikha ng bagay at nilulutas ang mga dependency. Ang Factory library (github.com/hmlongco/Factory) ay gumagamit ng @Injected(.service) para sa awtomatikong iniksyon. Ang mga DI pabrika ay sinusuri sa pamamagitan ng pagpapalit ng buong module ng isang linya: container.register { MockService() }.

Factory sa Android: companion factory at mga module ng DI

Android Factory — klasikong halimbawa: ViewModelProvider.Factory para sa paglikha ng ViewModel na may mga parameter. Inirerekomenda ng Google ang paggamit ng Hilt para sa awtomatikong pagbuo ng mga factory ng ViewModel — ang anotasyon na @HiltViewModel ay awtomatikong lumilikha ng Factory. Para sa mga simpleng bagay, ginagamit ang companion object na may pamamaraang create() o invoke(). Sa Kotlin, ang operator na invoke ay nagpapahintulot sa pagtawag sa pabrika bilang isang function: Factory(param).

Factory sa Jetpack Compose — ginagamit ang mga pabrika para sa paglikha ng mga estado at epekto. Ang remember { Factory.create() } ay lumilikha ng isang bagay sa unang pag-render at iniimbak ito sa buong buhay ng composable. Ang ViewModel sa Compose ay nilikha sa pamamagitan ng viewModel() — ito ay isang pabrika na pinamamahalaan ng Hilt. Sa Compose, ang mga pabrika ay bihirang lumitaw nang tahasan dahil ang DI at Compose StateManager ang humahawak sa paglikha ng mga bagay.

Factory vs Hilt — Dagger/Hilt ay awtomatikong bumubuo ng mga pabrika sa yugto ng kompilasyon. @Module + @Provides pumapalit sa Factory Method, @Binds pumapalit sa Abstract Factory. Ang mga manu-manong pabrika ay nananatiling may kaugnayan para sa dinamikong pagpili ng implementasyon sa runtime (A/B testing, feature flags). Para sa mga static na dependency, ganap na awtomatiko ng Hilt ang paglikha ng mga bagay — ang developer ay sumusulat lamang ng interface at mga anotasyon.

Mga madalas itanong

Paano naiiba ang Factory Method sa Abstract Factory?

Factory Method ay lumilikha ng isang uri ng bagay sa pamamagitan ng pamana — ni-override ng subclass ang factory method. Abstract Factory ay lumilikha ng isang pamilya ng mga bagay sa pamamagitan ng komposisyon — ang interface ng pabrika ay nagdedeklara ng mga pamamaraan para sa maraming produkto. Factory Method ay mas simple, Abstract Factory ay mas flexible para sa mga bahaging nakadepende sa platform o tematikong bahagi.

Kailan gagamitin ang Factory sa halip na DI?

Factory ay nabibigyang katwiran para sa dinamikong pagpili ng implementasyon sa runtime (A/B tests, feature flags, iba't ibang API para sa iba't ibang taripa). DI (Hilt, Dagger, Koin) ay mas gusto para sa mga static na dependency — awtomatiko nito ang paglikha at pag-i-inject. Factory at DI ay hindi eksklusibo sa isa't isa: ang DI ay maaaring gumamit ng Factory sa loob ng isang module.

Paano susuriin ang code na gumagamit ng Factory?

Factory ay sinusuri sa pamamagitan ng pagpapalit ng pabrika sa pamamagitan ng isang protocol. Sa pagsubok, ang isang TestFactory ay nilikha na nagpapatupad ng parehong protocol at nagbabalik ng mga mock-object. Para sa mga static na Factory method, ang pagsubok ay mas mahirap — nangangailangan ng DI container o swizzling. Inirerekomenda na palaging gumamit ng protocol para sa Factory upang mapanatili ang testability.

Ano ang ViewModelProvider.Factory sa Android?

ViewModelProvider.Factory — isang interface mula sa Jetpack na nagpapahintulot sa paglikha ng ViewModel na may mga custom na parameter. Kung walang pabrika, ang ViewModel ay nilikha sa pamamagitan ng reflection at maaari lamang magkaroon ng walang laman na constructor. Ang Factory ay tumatanggap ng mga parameter (repository, application context) at ipinapasa ang mga ito sa constructor ng ViewModel. Hilt ay awtomatikong bumubuo ng Factory para sa @HiltViewModel.

Paano nauugnay ang Factory sa prinsipyo ng bukas/sarado?

Factory ay nagpapatupad ng Open-Closed na prinsipyo: ang sistema ay bukas para sa pagpapalawak (bagong implementasyon ay idinadagdag sa pabrika), ngunit sarado para sa pagbabago (ang code ng kliyente ay hindi nagbabago). Ang pagdaragdag ng bagong uri ng produkto ay nangangailangan ng pagbabago lamang sa pabrika, hindi sa lahat ng kliyente. Ito ang pangunahing bentahe ng Factory kumpara sa direktang paglikha ng mga bagay.

Buod

  • Factory — creational pattern para sa paglikha ng mga bagay sa pamamagitan ng abstraksyon
  • Factory Method — isang pamamaraan na na-override sa mga subclass
  • Abstract Factory — interface para sa paglikha ng isang pamilya ng mga bagay
  • iOS — mga protocol at static na pamamaraan para sa mga pabrika
  • Android — companion object, ViewModelProvider.Factory, Hilt
  • DI vs Factory — DI awtomatiko ang paglikha, Factory para sa dinamikong pagpili
  • Pagsubok — Factory protocol ay sapilitan para sa pagpapalit ng mga implementasyon

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din