Pabrik memiliki banyak keunggulan yang memungkinkan desain aplikasi yang elegan dalam beberapa situasi. Salah satunya adalah Anda dapat mengatur properti objek yang nanti ingin Anda buat di satu tempat dengan membuat pabrik, lalu menyerahkan pabrik itu ke mana-mana. Tetapi seringkali Anda sebenarnya tidak perlu melakukan itu. Dalam hal menggunakan Pabrik hanya menambah kompleksitas tambahan tanpa benar-benar memberi Anda imbalan. Mari kita ambil pabrik ini, misalnya:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Salah satu alternatif dari pola Pabrik adalah pola Builder yang sangat mirip. Perbedaan utama adalah bahwa properti dari objek yang dibuat oleh Pabrik diatur ketika Pabrik diinisialisasi, sedangkan Builder diinisialisasi dengan keadaan default dan semua properti diatur setelahnya.
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
Tetapi ketika overengineering adalah masalah Anda, mengganti Pabrik dengan Builder kemungkinan tidak banyak perbaikan.
Penggantian paling sederhana untuk kedua pola tentu saja untuk membuat instance-objek dengan konstruktor sederhana dengan new
operator:
Widget widget = new ColoredWidget(COLOR_RED);
Konstruktor, bagaimanapun, memiliki kelemahan penting dalam sebagian besar bahasa berorientasi objek: Mereka harus mengembalikan objek dari kelas yang tepat dan tidak dapat mengembalikan sub-tipe.
Ketika Anda perlu memilih sub-tipe saat runtime tetapi tidak ingin menggunakan untuk membuat kelas Builder atau Factory baru untuk itu, Anda dapat menggunakan metode pabrik sebagai gantinya. Ini adalah metode statis kelas yang mengembalikan contoh baru dari kelas itu atau salah satu sub-kelasnya. Pabrik yang tidak memiliki status internal apa pun seringkali dapat diganti dengan metode pabrik seperti itu:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Fitur baru di Java 8 adalah referensi metode yang memungkinkan Anda untuk meneruskan metode, sama seperti yang Anda lakukan dengan pabrik stateless. Dengan mudah, apa pun yang menerima referensi metode juga menerima objek apa pun yang mengimplementasikan antarmuka fungsional yang sama, yang juga bisa menjadi Pabrik lengkap dengan keadaan internal, sehingga Anda dapat dengan mudah memperkenalkan pabrik nanti, ketika Anda melihat alasan untuk melakukannya.