Pengembang yang membangun aplikasi Laravel didorong untuk meninggalkan kata kunci new di dalam controller mereka dan beralih ke pola Factory Method. Dengan memindahkan pembuatan objek ke factory khusus, kode menjadi lebih mudah untuk diperluas, diuji, dan dipelihara—manfaat yang sangat penting saat proyek berkembang melampaui sekadar beberapa endpoint.

Mengapa kata kunci new adalah liabilitas tersembunyi

Ketika sebuah controller berisi baris seperti

$processor = new StripePaymentProcessor($config);

controller tersebut kini terikat erat (tightly coupled) dengan kelas StripePaymentProcessor. Setiap tempat yang membutuhkan pemroses pembayaran akan mengulangi baris tersebut, sehingga menyebarkan logika konstruksi ke seluruh codebase. Jika nantinya pemroses tersebut membutuhkan logger, cache manager, atau format konfigurasi yang berbeda, setiap titik tersebut harus diperbarui. Hasilnya adalah kode yang rapuh, sulit diubah, dan sulit untuk di-mock dalam unit test.

Pola Factory Method hadir sebagai solusi

Pola Factory Method menggantikan instansiasi langsung dengan sebuah metode yang mengembalikan instansi dari sebuah interface tertentu. Controller bergantung pada interface tersebut, sementara kelas factory mengetahui kelas konkret mana yang harus dibangun dan bagaimana menyusun dependensinya. Semua logika pembuatan berada di satu tempat, sehingga menambahkan dependensi baru atau menukar implementasi hanya akan berdampak pada factory tersebut.

Keuntungan utama

  • Loose coupling – Controller bekerja berdasarkan abstraksi, bukan kelas konkret.
  • Centralized construction – Mengubah proses pembuatan hanya memerlukan pengeditan satu file saja.
  • Testability – Factory dapat di-stub atau diganti dengan mock, memungkinkan pengujian controller secara terisolasi.
  • Open/Closed Principle – Fitur baru (misalnya, gateway pembayaran baru) dapat ditambahkan tanpa menyentuh kode controller yang sudah ada.

Analogi kedai kopi

Bayangkan seorang barista yang harus menggiling biji kopi, mengukus susu, dan menuangkan air secara manual untuk setiap pesanan, menggunakan serangkaian pernyataan if-else yang panjang. Jika resep latte berubah, setiap barista harus mempelajari kembali langkah-langkahnya. Mesin kopi yang menerima jenis pesanan dan menangani persiapannya secara internal menyelesaikan masalah ini: barista cukup memberi tahu mesin apa yang dibutuhkan, dan mesin tersebut mengenkapsulasi semua langkahnya. Memperbarui resep sekarang berarti menyesuaikan mesin, bukan setiap barista.

Laravel sudah mengandalkan factory

Komponen inti Laravel sendiri mengilustrasikan pola ini dalam praktiknya:

  • Database – ConnectionFactory memutuskan apakah akan membangun koneksi MySQL atau PostgreSQL.
  • Queues – QueueManager membuat driver untuk Redis, SQS, atau backend lainnya.
  • Filesystem – FilesystemManager menghasilkan instansi disk lokal atau S3.
  • Mail – MailManager menyelesaikan driver SMTP, Mailgun, atau driver email lainnya.

Jika framework mempercayai factory untuk layanan-layanan kritis ini, kode kustom pun sebaiknya mengikuti hal yang sama.

Kapan harus memperkenalkan factory

Gunakan factory ketika:

  • Pembuatan objek melibatkan beberapa langkah konfigurasi atau layanan eksternal.
  • Terdapat beberapa implementasi yang dapat saling menggantikan (gateway pembayaran yang berbeda, penyedia penyimpanan, dll.).
  • Daftar implementasi yang memungkinkan diperkirakan akan bertambah.

Hindari factory ketika:

  • Konstruksi hanya berupa satu panggilan new yang tidak dapat diubah tanpa pengaturan tambahan.
  • Hanya satu implementasi yang akan digunakan, sehingga abstraksi tambahan menjadi overhead yang tidak perlu.

Panduan cepat: melakukan refactoring pada payment controller

  1. Definisikan sebuah interface – PaymentProcessorInterface dengan metode process(array $data).
  2. Implementasikan kelas konkret – StripePaymentProcessor, PayPalPaymentProcessor, yang masing-masing memenuhi interface tersebut.
  3. Buat sebuah factory – PaymentProcessorFactory dengan metode make(string $driver): PaymentProcessorInterface. Di dalamnya, gunakan switch atau map untuk mengembalikan kelas yang sesuai, dengan menyuntikkan (injecting) layanan apa pun yang diperlukan dari service container Laravel.
  4. Suntikkan (Inject) factory – Di dalam constructor controller, gunakan type-hint PaymentProcessorFactory. Laravel akan menyelesaikannya secara otomatis.
  5. Gunakan factory – $processor = $this->processorFactory->make('stripe'); $processor->process($request->all());

Sekarang controller tidak pernah menyebutkan new atau pemroses konkret. Menambahkan gateway baru berarti membuat kelas baru dan memperluas map pada factory—tanpa perlu mengubah kode controller.

Potensi kekurangan dan cara mengatasinya

Kritik utama terhadap factory adalah adanya indirection tambahan, yang dapat terasa bertele-tele untuk objek yang sepele. Melakukan over-engineering pada layanan sederhana dapat membengkakkan codebase tanpa manfaat nyata. Kuncinya adalah menilai kompleksitas konstruksi: jika sebuah objek hanyalah penampung data biasa tanpa dependensi, penggunaan new secara langsung mungkin dapat diterima. Selain itu, factory dapat menjadi tempat pembuangan bagi logika yang tidak terkait. Menjaga agar factory tetap fokus pada pembuatan objek dan mendelegasikan konfigurasi ke service provider khusus akan menjaga kejelasan.

Hal yang perlu diperhatikan selanjutnya

  • Service container bindings – Container Laravel dapat menyelesaikan factory secara otomatis jika Anda mengikat interface ke class factory di dalam sebuah service provider.
  • Auto-discovery – Beberapa paket mengekspos factory mereka sendiri; waspadai adanya tabrakan penamaan.
  • Testing strategies – Saat melakukan unit testing pada controller, ganti factory dengan mock yang mengembalikan stubbed processor, guna memastikan pengujian tetap cepat dan terisolasi.

Intinya

Mengganti panggilan new yang tersebar dengan factory yang ditempatkan dengan baik akan memusatkan konstruksi, mengurangi coupling, dan menyelaraskan kode kustom dengan filosofi desain Laravel itu sendiri. Bagi tim yang mengantisipasi pertumbuhan—penyedia pembayaran baru, backend penyimpanan, atau komponen bergaya plug-in apa pun—pola Factory Method adalah investasi berbiaya rendah yang memberikan imbal balik berupa fleksibilitas dan kepercayaan diri. Diri Anda di masa depan, dan siapa pun yang mewarisi kode tersebut, akan berterima kasih kepada Anda.