Pada titik ini, Anda mungkin sudah menemukan pola desain. Misalnya, tunggal .

Mari kita ingat apa itu pola, mengapa dibutuhkan, dan apa itu pola kreasi (tunggal adalah contohnya). Kita juga akan mempelajari pola baru: metode pabrik.

Dalam pengembangan perangkat lunak, pola desain adalah konstruksi arsitektur berulang yang mewakili solusi untuk masalah desain dalam beberapa konteks berulang.

Biasanya, pola bukanlah solusi akhir yang dapat langsung diubah menjadi kode. Itu hanyalah solusi model untuk masalah yang dapat digunakan dalam berbagai situasi.

Pola penciptaan adalah pola desain yang berhubungan dengan proses pembuatan objek. Mereka memungkinkan untuk membuat sistem yang independen dari metode yang digunakan untuk membuat, menyusun, dan menampilkan objek.

Metode pabrik adalah pola desain pembuatan yang mendefinisikan antarmuka umum untuk membuat objek di kelas induk, memberikan keturunannya kemampuan untuk membuat objek ini. Pada saat pembuatan, keturunan dapat menentukan kelas mana yang akan dibuat.

Masalah apa yang dipecahkan oleh pola tersebut?

Bayangkan Anda memutuskan untuk membuat program pengiriman. Awalnya, Anda akan menyewa kurir dengan mobil dan menggunakan aMobilobjek untuk mewakili kendaraan pengiriman dalam program. Kurir mengantarkan paket dari titik A ke titik B dan seterusnya. Mudah sekali.

Program ini mendapatkan popularitas. Bisnis Anda berkembang dan Anda ingin berekspansi ke pasar baru. Misalnya, Anda juga dapat memulai pengiriman makanan dan pengiriman barang. Dalam hal ini, makanan dapat diantarkan melalui kurir dengan berjalan kaki, skuter, dan sepeda, tetapi truk diperlukan untuk pengangkutan.

Sekarang Anda perlu melacak beberapa hal (kapan, kepada siapa, apa dan berapa banyak yang akan dikirimkan), termasuk berapa banyak yang dapat dibawa oleh masing-masing kurir. Moda transportasi baru memiliki kecepatan dan kapasitas yang berbeda. Kemudian Anda melihat bahwa sebagian besar entitas dalam program Anda sangat terikat denganMobilkelas. Anda menyadari bahwa untuk membuat program Anda berfungsi dengan metode pengiriman lain, Anda harus menulis ulang basis kode yang ada dan melakukannya lagi setiap kali Anda menambahkan kendaraan baru.

Hasilnya adalah kode mengerikan yang diisi dengan pernyataan bersyarat yang melakukan tindakan berbeda tergantung pada jenis transportasinya.

Solusinya

Pola metode pabrik menyarankan pembuatan objek dengan memanggil metode pabrik khusus daripada langsung menggunakan operator baru . Subclass dari class yang memiliki factory method dapat memodifikasi objek yang dibuat dari kendaraan tertentu. Sekilas, ini mungkin tampak tidak berguna: kami hanya memindahkan panggilan konstruktor dari satu tempat ke tempat lain dalam program. Tapi sekarang Anda bisa mengganti metode pabrik di subkelas untuk mengubah jenis transportasi yang sedang dibuat.

Mari kita lihat diagram kelas untuk pendekatan ini:

Agar sistem ini berfungsi, semua objek yang dikembalikan harus memiliki antarmuka yang sama. Subclass akan dapat menghasilkan objek dari kelas yang berbeda yang mengimplementasikan interface ini.

Misalnya, kelas Truk dan Mobil mengimplementasikan antarmuka CourierTransport dengan metode pengiriman . Masing-masing kelas mengimplementasikan metode dengan cara yang berbeda: truk mengantarkan barang, sementara mobil mengantarkan makanan, paket, dan sebagainya. Metode pabrik di kelas TruckCreator mengembalikan objek truk, dan kelas CarCreator mengembalikan objek mobil.

Untuk klien dari metode pabrik, tidak ada perbedaan antara objek-objek ini, karena akan memperlakukannya sebagai semacam CourierTransport abstrak . Klien akan sangat peduli bahwa objek memiliki metode pengiriman, tetapi bagaimana tepatnya metode itu bekerja tidaklah penting.

Implementasi di Jawa:


public interface CourierTransport {
	void deliver();
}
public class Car implements CourierTransport {
	@Override
	public void deliver() {
    		System.out.println("The package is being delivered by car");
	}
}
public class Truck implements CourierTransport {
	@Override
	public void deliver() {
    		System.out.println("The freight is being delivered by truck");
	}
}
public abstract class CourierTransportCreator {
	public abstract CourierTransport createTransport();
}
public class CarCreator extends CourierTransportCreator {
	@Override
	public CourierTransport createTransport() {
    		return new Car();
	}
}
public class TruckCreator extends CourierTransportCreator {
	@Override
	public CourierTransport createTransport() {
    		return new Truck();
	}
}
 
public class Delivery {
	private String address;
	private CourierTransport courierTransport;
 
	public void Delivery() {
	}
 
	public Delivery(String address, CourierTransport courierTransport) {
    	this.address = address;
    	this.courierTransport = courierTransport;
	}
 
	public CourierTransport getCourierTransport() {
    		return courierTransport;
	}
 
	public void setCourierTransport(CourierTransport courierTransport) {
    		this.courierTransport = courierTransport;
	}
 
	public String getAddress() {
    		return address;
	}
 
	public void setAddress(String address) {
    		this.address = address;
	}
}
public static void main(String[] args) {
    	// Accept a new type of order from the database (pseudocode)
    	String type = database.getTypeOfDeliver();
 
    	Delivery delivery = new Delivery();
    	
    	// Set the transport for delivery
        delivery.setCourierTransport(getCourierTransportByType(type));
    	
    	// Make the delivery
        delivery.getCourierTransport().deliver();
 
	}
 
	public static CourierTransport getCourierTransportByType(String type) {
    	switch (type) {
        	case "CarDelivery":
            	return new CarCreator().createTransport();
        	case "TruckDelivery":
            	return new TruckCreator().createTransport();
        	default:
            	throw new RuntimeException();
	    }
	}
    

Jika kita ingin membuat objek pengiriman baru, maka program akan secara otomatis membuat objek transportasi yang sesuai.

Kapan kita harus menerapkan pola ini?

1. Saat Anda tidak mengetahui sebelumnya jenis dan dependensi objek yang perlu dikerjakan oleh kode Anda.

Metode pabrik memisahkan kode untuk memproduksi alat transportasi dari kode yang menggunakan alat transportasi tersebut. Hasilnya, kode untuk membuat objek dapat diperluas tanpa menyentuh kode lainnya.

Misalnya, untuk menambahkan dukungan untuk jenis transportasi baru, Anda perlu membuat subkelas baru dan menentukan metode pabrik di dalamnya yang mengembalikan turunan dari transportasi baru.

2. Saat Anda ingin menghemat sumber daya sistem dengan menggunakan kembali objek yang ada alih-alih membuat yang baru.

Masalah ini biasanya terjadi saat bekerja dengan objek intensif sumber daya, seperti koneksi database, sistem file, dll.

Pikirkan langkah-langkah yang perlu Anda ambil untuk menggunakan kembali objek yang ada:

  1. Pertama, Anda perlu membuat repositori bersama untuk menyimpan semua objek yang Anda buat.

  2. Saat meminta objek baru, Anda perlu melihat ke dalam repositori dan memeriksa apakah objek tersebut berisi objek yang tersedia.

  3. Kembalikan objek ke kode klien.

  4. Tetapi jika tidak ada objek yang tersedia, buat yang baru dan tambahkan ke repositori.

Semua kode ini harus diletakkan di suatu tempat yang tidak akan mengacaukan kode klien. Tempat yang paling nyaman adalah konstruktor, karena kita hanya memerlukan semua pemeriksaan ini saat membuat objek. Sayangnya, konstruktor selalu membuat objek baru — ia tidak dapat mengembalikan objek yang sudah ada.

Itu berarti bahwa diperlukan metode lain yang dapat mengembalikan objek yang ada dan yang baru. Ini akan menjadi metode pabrik.

3. Saat Anda ingin mengizinkan pengguna memperluas bagian kerangka kerja atau pustaka Anda.

Pengguna dapat memperluas kelas kerangka kerja Anda melalui pewarisan. Tapi bagaimana Anda membuat kerangka kerja membuat objek dari kelas baru ini daripada yang standar?

Solusinya adalah membiarkan pengguna memperluas tidak hanya komponen, tetapi juga kelas yang membuat komponen tersebut. Dan untuk ini, kelas pembuat harus memiliki metode pembuatan khusus yang dapat ditentukan.

Keuntungan

  • Memisahkan kelas dari kelas transportasi tertentu.
  • Menyimpan kode untuk membuat bentuk transportasi di satu tempat, membuat kode lebih mudah dipelihara.
  • Menyederhanakan penambahan moda transportasi baru ke dalam program.
  • Menerapkan prinsip buka-tutup.

Kekurangan

Dapat menyebabkan hierarki kelas paralel yang besar, karena setiap kelas produk harus memiliki subkelas pembuatnya sendiri.

Mari kita meringkas

Anda mempelajari tentang pola metode pabrik dan melihat satu kemungkinan implementasi. Pola ini sering digunakan di berbagai perpustakaan yang menyediakan objek untuk membuat objek lain.

Gunakan pola metode pabrik saat Anda ingin dengan mudah menambahkan objek baru dari subkelas dari kelas yang ada untuk berinteraksi dengan logika bisnis utama Anda dan tidak menggembungkan kode Anda karena konteks yang berbeda.