![Macam-Macam Factory dalam Programming](https://images.ctfassets.net/7wjlcr9d5ii8/7MFkwZA9W8teg5CnMhySjW/2f31466b69ca8daac441a2c393c8f3b8/23644682851_1c1a86efd8_o.jpg?w=750&h=750&fl=progressive&q=100&fm=jpg&fit=thumb&f=faces)
Dalam pemrograman seringkali kita temui terminologi "Factory" dalam aktivitas perkodingan. Ga sedikit juga yang merasa ambigu, factory yang dimaksud yang kayak gimana sih? Biar ga bingung, gw mencoba menjelaskan beberapa istilah factory yang sering digunakan di dalam pemrograman. Secara umum "Factory" di sini maksudnya adalah action untuk menciptakan objek. Kurang lebih terdapat 5 istilah Factory yang sering dijumpai.
Simple Factory Design Pattern bukan bagian dari Design Pattern yang ditulis dalam bukunya Gang of Four. Sesuai namanya, Simple Factory hanyalah bentuk sederhana dari Factory Method Design Pattern. Simple Factory biasanya hanyalah sebuah method yang bertugas memilihkan implementasi objek yang ingin digunakan berdasarkan input user. Hanya itu! Simple Factory memiliki batasan-batasan seperti tidak bisa memiliki variant Factory karena biasanya ditulis dalam bentuk static, dan sulit di-maintain ketika terjadi perubahan-perubahan requirement karena sangat tightly-coupled. Jika suatu saat jumlah implementasi objek-nya semakin banyak, maka solusinya bisa dengan membuat subclass menggunakan Factory Method Design Pattern. Contoh implementasi code Simple Factory Design Pattern adalah seperti berikut:
public static Laptop buildLaptop(String laptop){
if("asus".equals(laptop)){
return new AsusRog();
}
if("dell".equals(laptop)){
return new DellAlienWare();
}
throw new IllegalArgumentException("not found");
}
Ini versi lain dari Simple Factory. Jika Simple Factory menggunakan static method untuk memilihkan implementasi objek yang diinginkan, maka Map Factory menggunakan HashMap. Overall kelebihan dan kekurangannya kurang lebih sama persis seperti Simple Factory. Kelebihannya adalah lebih bersih karena tidak banyak branching if-else atau switch-case. Cukup put key dan value berupa input & objek ke dalam Map. Lalu nanti kita mendapatkan objek implementasinya menggunakan method get() dari Map. Selain itu kita dapat membuatnya sebagai public constant, jadi tidak perlu di-cek satu-persatu tiap line setiap diakses seperti Simple Factory. Contoh implementasi code-nya adalah:
public static final Map<String, Laptop> laptopMap;
static {
Map<String, Laptop> map = new HashMap<>();
map.put("asus", new AsusRog());
map.put("dell", new DellAlienWare());
laptopMap = Collections.unmodifiableMap(map);
}
public static void main(String[] args){
Laptop asus = getLaptop("asus");
System.out.println("asus.getLaptopName() = " + asus.getLaptopName());
}
public static Laptop getLaptop(String type){
Laptop laptop = laptopMap.get(type);
if(laptop == null){
throw new IllegalArgumentException("not found");
}
return laptop;
}
Pada code di atas kita mendeklarasikan Map sebagai constant lewat static initializer. Tidak lupa juga diberikan final modifier agar tidak bisa di-assign ulang dan didekorasi menggunakan Collections.umodifiableMap() agar elemennya tidak bisa dimutasi. Tapi sebenarnya ini ga lebih baik juga dari Simple Factory. Keduanya sama-sama cukup repot maintenance-nya.
Ini adalah salah satu Design Pattern yang ditulis di dalam bukunya Gang of Four. Factory Method Design Pattern lebih fleksibel daripada Simple Factory karena dibungkus ke dalam sebuah interface. Sehingga jika terdapat variant Factory baru, tinggal bikin class baru dengan mengimplementasi interface yang sama. Code-nya lebih loosely-coupled. Factory Method berfokus pada inheritance. Untuk lebih jelasnya bisa baca tulisan gw sebelumnya tentang Factory Method Design Pattern.
Ini juga termasuk salah satu Design Pattern yang ditulis di dalam bukunya Gang of Four. Ini adalah bentuk upgrade dari Factory Method Design Pattern. Scope-nya lebih luas. Fokusnya ga hanya pada inheritance, tapi juga pada composition. Masing-masing factory memiliki komposisi satu set family objek yang diciptakan. Oleh karena itu Abstract Factory lebih kompleks daripada Factory Method. Abstract Factory biasanya digunakan setelah Factory Method sudah semakin kompleks. Untuk lebih lengkapnya bisa kunjungi postingan gw tentang Abstract Factory Design Pattern.
Ini sebenarnya hanyalah OOP hacks yang dipopulerkan oleh para sesepuh OOP. Martin Fowler menyebutnya Static Factory Methods, sedangkan Joshua Bloch menyebutnya Creation Methods, keduanya merujuk ke hal yang sama. Tujuannya adalah sebagai pengganti constructor yang memiliki beberapa limitasi. Dengan constructor kita tidak bisa memberi nama constructor tersebut kecuali dengan nama Class itu tersendiri. Kita juga tidak bisa membuat lebih dari satu buah constructor dengan jenis parameter yang sama. Contohnya seperti berikut:
public class Phone{
private String phoneNumber;
private String type;
public Phone(String phoneNumber){
this.phoneNumber = phoneNumber;
}
public Phone(String type){
this.type = type;
}
}
Code di atas akan compile error karena terdapat lebih dari satu constructor dengan parameter yang sama. Solusinya untuk case di atas adalah dengan membuat static factory atau creation method masing-masing sesuai yang dibutuhkan. Hasilnya seperti berikut:
public class Phone{
private String phoneNumber;
private String type;
private Phone(String phoneNumber, String type){
this.phoneNumber = phoneNumber;
this.type = type;
}
public static Phone createByPhoneNumber(String phoneNumber){
return new Phone(phoneNumber, null);
}
public static Phone createByType(String type){
return new Phone(null, type);
}
}
Contoh penggunaan
public static void main(String[] args){
Phone byPhoneNumber = Phone.createByPhoneNumber("08108081");
Phone byType = Phone.createByType("Nokia 6600");
}
Dengan begitu code lebih readable karena kita bisa "memberi nama" lewat static method dan tidak compile error karena tidak ada duplikat constructor.
Kira-kira begitulah macam-macam terminologi "Factory" yang biasa kita dengar di dunia programming. Semua factory tujuan utamanya sama, yaitu menciptakan objek. Semoga setelah membaca ini tidak bingung lagi dengan istilah-istilah ini.