Factory — pola kreasional yang mendelegasikan pembuatan objek ke metode pabrik. Dalam pengembangan mobile, Factory Method dan Abstract Factory digunakan untuk membuat ViewModel, NetworkClient, Repository, dan dependensi lainnya. Factory mengisolasi logika instansiasi, menyederhanakan penggantian implementasi. Selengkapnya — di Refactoring Guru: Factory Method.
Poin utama
Factory — pola desain kreasional dari katalog GoF. Ide utama: memindahkan logika pembuatan objek dari kode klien ke metode atau kelas terpisah. Klien bekerja dengan antarmuka atau kelas abstrak, dan implementasi konkret dibuat oleh pabrik. Ini menerapkan prinsip pembalikan dependensi (Dependency Inversion): klien tidak bergantung pada kelas konkret, hanya pada abstraksi.
Dua variasi Factory: Factory Method dan Abstract Factory. Factory Method — satu metode dalam kelas yang ditimpa oleh subclass untuk membuat objek. Abstract Factory — antarmuka dengan keluarga metode pabrik untuk membuat grup objek yang saling terkait. Kedua varian memecahkan masalah yang sama: klien tidak langsung memanggil new MyClass(), tetapi meminta pabrik untuk membuat objek berdasarkan jenis atau parameternya.
Factory vs new() — pembuatan objek langsung mengikat kode secara kaku ke implementasi konkret. Factory menambahkan lapisan perantara: perubahan implementasi hanya memerlukan perubahan di pabrik, bukan di semua klien. Dalam pengembangan mobile, Factory digunakan secara aktif untuk membuat ViewModel (ViewModelProvider.Factory), klien jaringan (Retrofit.create()), adaptor daftar, dan pabrik serialisasi. Kontainer DI (Dagger, Koin) secara otomatis menghasilkan pabrik.
Factory Method — metode yang dideklarasikan dalam protokol atau kelas abstrak yang mengembalikan objek dari tipe tertentu. Subclass mengimplementasikan metode ini, membuat instance konkret. Di Swift, ini bisa berupa static method dalam protokol atau metode di kelas dasar. Di Kotlin — companion object dengan metode pabrik atau open fun di kelas abstrak. Pola ini banyak digunakan untuk membuat parser, pabrik kesalahan, dan pembangun kueri.
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()
}
}
}
// Penggunaan
let gateway = PaymentFactory.create(type: .stripe)
Versi Kotlin Factory Method menggunakan companion object atau sealed class untuk membatasi tipe. Sealed class memastikan bahwa cabang when mencakup semua tipe yang mungkin — kompiler memeriksa kelengkapan. Ini tipikal untuk proyek Android, di mana pabrik membuat implementasi Repository atau DataSource yang berbeda tergantung pada build flavour atau konfigurasi.
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 — pola untuk membuat keluarga objek yang saling terkait atau saling bergantung tanpa menentukan kelas konkretnya. Klien bekerja dengan antarmuka pabrik abstrak yang mendefinisikan metode untuk membuat setiap produk dari keluarga. Pabrik konkret mengimplementasikan antarmuka dan membuat objek dari varian tertentu. Misalnya, pabrik komponen UI untuk iOS membuat UIButton, UILabel, UITableView, dan untuk Android — Button, TextView, RecyclerView.
Abstract Factory vs Factory Method — Factory Method membuat satu tipe objek melalui pewarisan, Abstract Factory membuat keluarga objek melalui komposisi. Factory Method ditimpa di subclass, Abstract Factory menyediakan beberapa metode pabrik melalui protokol. Abstract Factory sering berisi beberapa Factory Method. Dalam pengembangan mobile, Abstract Factory digunakan untuk komponen yang bergantung pada platform, tema, dan pabrik basis data.
| Karakteristik | Factory Method | Abstract Factory |
|---|---|---|
| Jumlah produk | Satu | Keluarga (beberapa) |
| Mekanisme | Pewarisan (override) | Komposisi (protocol/interface) |
| Contoh iOS | PaymentFactory.create() | UIComponentFactory untuk iOS/Android |
| Contoh Android | ViewModelProvider.Factory | ThemeFactory: membuat tombol, teks, kartu |
| Fleksibilitas | Penggantian subclass sederhana | Penggantian keluarga penuh |
Kasus nyata Abstract Factory di Android — implementasi berbagai jenis basis data (SQLite vs Room) melalui antarmuka DatabaseFactory terpadu. Pabrik membuat objek DAO, migrasi, dan kumpulan koneksi. Di iOS — pabrik layanan untuk lingkungan yang berbeda (Development/Staging/Production). Abstract Factory jarang digunakan secara langsung — fungsinya diambil alih oleh kontainer DI (Dagger Module, Swinject Assembly).
Swift Factory diimplementasikan melalui protokol dan metode statis. Protokol Factory mendeklarasikan metode create() yang mengembalikan tipe abstrak. Pabrik konkret mengimplementasikan protokol dan membuat objek yang diperlukan. Swift tidak memerlukan kelas pabrik terpisah untuk kasus sederhana — metode statis di enum atau struct sudah cukup. Untuk skenario kompleks, protokol Factory digunakan dengan injeksi melalui DI.
Factory di iOS SDK — banyak pabrik sistem: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:). Pengembang membuat pabrik untuk ViewController (StoryboardFactory), untuk layanan (ServiceFactory), dan untuk model data. Factory Method digunakan secara aktif dalam arsitektur VIPER dan Clean Swift untuk membuat modul layar.
Factory + DI — alternatif modern: kontainer DI (Swinject, Factory) secara otomatis menghasilkan pabrik untuk tipe yang terdaftar. Kontainer menyimpan resep pembuatan objek dan menyelesaikan dependensi. Pustaka Factory (github.com/hmlongco/Factory) menggunakan @Injected(.service) untuk injeksi otomatis. Pabrik DI diuji dengan mengganti seluruh modul dengan satu baris: container.register { MockService() }.
Android Factory — contoh klasik: ViewModelProvider.Factory untuk membuat ViewModel dengan parameter. Google merekomendasikan penggunaan Hilt untuk menghasilkan pabrik ViewModel secara otomatis — anotasi @HiltViewModel membuat Factory secara otomatis. Untuk objek sederhana, digunakan companion object dengan metode create() atau invoke(). Di Kotlin, operator invoke memungkinkan memanggil pabrik seperti fungsi: Factory(param).
Factory di Jetpack Compose — pabrik digunakan untuk membuat status dan efek. remember { Factory.create() } membuat objek pada render pertama dan menyimpannya selama masa hidup composable. ViewModel di Compose dibuat melalui viewModel() — ini adalah pabrik yang dikelola oleh Hilt. Di Compose, pabrik jarang muncul secara eksplisit karena DI dan Compose StateManager menangani pembuatan objek.
Factory vs Hilt — Dagger/Hilt secara otomatis menghasilkan pabrik pada tahap kompilasi. @Module + @Provides menggantikan Factory Method, @Binds menggantikan Abstract Factory. Pabrik manual tetap relevan untuk pemilihan implementasi dinamis saat runtime (pengujian A/B, feature flags). Untuk dependensi statis, Hilt sepenuhnya mengotomatiskan pembuatan objek — pengembang hanya menulis antarmuka dan anotasi.
Pertanyaan yang sering diajukan
Factory Method membuat satu tipe objek melalui pewarisan — subclass menimpa metode pabrik. Abstract Factory membuat keluarga objek melalui komposisi — antarmuka pabrik mendeklarasikan metode untuk beberapa produk. Factory Method lebih sederhana, Abstract Factory lebih fleksibel untuk komponen yang bergantung pada platform atau tematik.
Factory dibenarkan untuk pemilihan implementasi dinamis saat runtime (pengujian A/B, feature flags, API berbeda untuk tarif berbeda). DI (Hilt, Dagger, Koin) lebih disukai untuk dependensi statis — mengotomatiskan pembuatan dan injeksi. Factory dan DI tidak saling eksklusif: DI dapat menggunakan Factory di dalam modul.
Factory diuji dengan mengganti pabrik melalui protokol. Dalam pengujian, TestFactory dibuat yang mengimplementasikan protokol yang sama dan mengembalikan objek mock. Untuk metode Factory statis, pengujian lebih sulit — memerlukan kontainer DI atau swizzling. Disarankan untuk selalu menggunakan protokol untuk Factory guna menjaga kemampuan pengujian.
ViewModelProvider.Factory — antarmuka dari Jetpack yang memungkinkan pembuatan ViewModel dengan parameter khusus. Tanpa pabrik, ViewModel dibuat melalui refleksi dan hanya dapat memiliki konstruktor kosong. Factory menerima parameter (repositori, application context) dan meneruskannya ke konstruktor ViewModel. Hilt menghasilkan Factory secara otomatis untuk @HiltViewModel.
Factory menerapkan prinsip Open-Closed: sistem terbuka untuk perluasan (implementasi baru ditambahkan ke pabrik), tetapi tertutup untuk modifikasi (kode klien tidak berubah). Penambahan jenis produk baru hanya memerlukan perubahan di pabrik, bukan di semua klien. Ini adalah keunggulan utama Factory dibandingkan pembuatan objek langsung.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga