Hai teman! Hari ini kita akan terus mempelajari pola desain. Dalam pelajaran ini, kita akan berbicara tentang pabrik. Kami akan membahas masalah yang dipecahkan oleh pola ini dan melihat contoh bagaimana sebuah pabrik dapat membantu Anda membuka kedai kopi. Selain itu, saya akan memberi Anda 5 langkah sederhana untuk membuat pabrik.
Untuk memastikan bahwa kita semua berada pada gelombang yang sama dan Anda akan segera memahami konsep ini, Anda harus terbiasa dengan topik berikut:
Langkah 2. Anda membuat

- Warisan di Jawa
- Penyempitan dan pelebaran tipe referensi di Jawa
- Interaksi antara kelas dan objek yang berbeda.
Apa itu pabrik?
Pola desain pabrik memungkinkan Anda mengontrol pembuatan objek. Proses pembuatan objek baru tidaklah super sederhana, tetapi juga tidak terlalu rumit. Kita semua tahu bahwa kita membutuhkannew
operator untuk membuat objek baru. Mungkin sepertinya tidak ada yang bisa dikendalikan di sini, tapi itu tidak benar. Misalkan aplikasi kita memiliki kelas tertentu yang memiliki banyak keturunan. Kesulitan dapat muncul ketika diperlukan untuk membuat instance dari kelas tertentu tergantung pada kondisi tertentu. Pabrik adalah pola desain yang membantu menyelesaikan masalah pembuatan berbagai objek tergantung pada kondisi tertentu . Bagaimana itu untuk konsep abstrak? Ini akan menjadi lebih jelas dan lebih spesifik ketika kita melihat contoh di bawah ini.
Mari kita siapkan berbagai jenis kopi
Misalkan kita ingin mengotomatiskan kedai kopi. Kami perlu mengajarkan program kami cara membuat berbagai jenis kopi. Untuk itu, kita akan membuat kelas kopi dan beberapa kelas turunan untuk mewakili jenis kopi yang akan kita siapkan: Americano, cappucino, espresso, dan latte. Mari kita mulai dengan kelas kopi umum:
public class Coffee {
public void grindCoffee(){
// Grind the coffee
}
public void makeCoffee(){
// Brew the coffee
}
public void pourIntoCup(){
// Pour into a cup
}
}
Selanjutnya, kita akan membuat kelas anaknya:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Pelanggan kami dapat memesan semua jenis kopi. Perintah mereka harus diteruskan ke program. Ini dapat dilakukan dengan berbagai cara, misalnya menggunakan String
. Tapi yang enum
terbaik untuk ini. Kami akan membuat enum
dan menentukan bidang enum yang sesuai dengan jenis kopi yang dapat dipesan:
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
Besar. Sekarang mari tulis kode untuk kedai kopi kita:
public class CoffeeShop {
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new Americano();
break;
case ESPRESSO:
coffee = new Espresso();
break;
case CAPPUCCINO:
coffee = new Cappucсino();
break;
case CAFFE_LATTE:
coffee = new CaffeLatte();
break;
}
coffee.grindCoffee();
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Here's your coffee! Thanks! Come again!");
return coffee;
}
}
Metode ini orderCoffee
dapat dibagi menjadi dua bagian:
- Pembuatan contoh kopi tertentu dalam sebuah
switch
pernyataan. Di sinilah pabrik melakukan apa yang dilakukannya — membuat jenis tertentu tergantung pada kondisi. - Persiapan — ini adalah penggilingan, pembuatan bir, dan penuangan ke dalam cangkir.
- Langkah-langkah yang terlibat dalam persiapan itu sendiri (menggiling, menyeduh, dan menuangkan ke dalam cangkir) tidak akan berubah (setidaknya kami mengandalkan ini).
- Tapi bermacam-macam kopi bisa berubah. Mungkin kita akan mulai membuat mocha... Frappu... Mochacci... Terserah, kopi jenis baru.
switch
. Mungkin juga di kedai kopi kita orderCoffee
metode ini bukan satu-satunya tempat di mana kita akan membuat berbagai jenis kopi. Akibatnya, perubahan harus dilakukan di beberapa tempat. Anda mungkin sudah mengerti apa yang saya maksud. Kita perlu melakukan refactor. Pindahkan blok yang bertanggung jawab untuk membuat kopi ke kelas terpisah karena dua alasan:
- Kita dapat menggunakan kembali logika pembuatan kopi di tempat lain.
- Jika bermacam-macam berubah, kita tidak perlu mengedit kode di mana pun kopi dibuat. Cukup mengubah kode kita di satu tempat saja.
Menyiapkan pabrik pertama kami
Untuk melakukan ini, kami akan membuat kelas baru yang hanya akan bertanggung jawab untuk membuat instance kelas kopi yang diperlukan:
public class SimpleCoffeeFactory {
public Coffee createCoffee(CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new Americano();
break;
case ESPRESSO:
coffee = new Espresso();
break;
case CAPPUCCINO:
coffee = new Cappucino();
break;
case CAFFE_LATTE:
coffee = new CaffeLatte();
break;
}
return coffee;
}
}
Selamat! Kami baru saja mengimplementasikan pola desain pabrik dalam bentuknya yang paling sederhana (hampir). Itu bisa lebih sederhana jika kita membuat metodenya createCoffee
statis. Tapi kemudian kita akan kehilangan dua kemampuan:
- Kemampuan untuk mewarisi
SimpleCoffeeFactory
dan mengganticreateCoffee
metode. - Kemampuan untuk menambahkan implementasi pabrik yang diperlukan ke kelas kami.
Menambahkan pabrik ke kedai kopi
Mari menulis ulang kelas kedai kopi menggunakan pabrik:
public class CoffeeShop {
private final SimpleCoffeeFactory coffeeFactory;
public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
this.coffeeFactory = coffeeFactory;
}
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = coffeeFactory.createCoffee(type);
coffee.grindCoffee();
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Here's your coffee! Thanks! Come again!");
return coffee;
}
}
Bagus sekali. Sekarang kami akan memberikan gambaran singkat tentang struktur umum dari pola desain pabrik.
5 langkah membuka pabrik sendiri
Langkah 1. Program Anda memiliki kelas dengan beberapa keturunan, seperti pada diagram di bawah ini:
enum
field untuk setiap kelas anak:
enum CatType {
LION,
TIGER,
FLUFFY
}
Langkah 3. Bangun pabrik Anda. Sebut saja CatFactory
. Ini kodenya:
class CatFactory {}
Langkah 4. Di pabrik Anda, buat createCat
metode yang menggunakan CatType
argumen. Ini kodenya:
class CatFactory {
public Cat createCat(CatType type) {
}
}
Langkah 5. Di badan metode, tulis switch
pernyataan yang menghitung bidang enum dan membuat instance kelas yang sesuai dengan enum
nilai yang diteruskan:
class CatFactory {
public Cat createCat(CatType type) {
Cat cat = null;
switch (type) {
case LION:
cat = new Fluffy();
break;
case TIGER:
cat = new Tiger();
break;
case FLUFFY:
cat = new Lion();
break;
}
return cat;
}
}
Sekarang Anda dapat menjalankan pabrik seperti bos. :)
GO TO FULL VERSION