Hai teman! Hari ini kami akan terus mempelajari pola desain bersama Anda. Pada kuliah kali ini kita akan membahas tentang Pabrik. Kami akan berdiskusi dengan Anda masalah apa yang dapat diselesaikan menggunakan templat ini, dan melihat contoh bagaimana pabrik membantu membuka kedai kopi. Dan saya juga akan memberikan 5 langkah sederhana untuk membuat pabrik. Agar memiliki pemikiran yang sama dengan semua orang dan dengan mudah memahami esensinya, Anda harus memahami topik-topik berikut:
- Warisan di Jawa
- Mempersempit dan memperluas tipe referensi di Java
- Interaksi antara kelas dan objek yang berbeda
Apa itu Pabrik?
Pola desain Pabrik memungkinkan Anda mengontrol pembuatan objek. Proses pembuatan objek baru tidaklah sesederhana itu, namun juga tidak terlalu rumit. Kita semua tahu bahwa untuk membuat objek baru kita harus menggunakannew
. Dan tampaknya tidak ada yang perlu dikelola di sini, tetapi kenyataannya tidak demikian. Kesulitan mungkin muncul ketika aplikasi kita memiliki kelas tertentu yang memiliki banyak turunan, dan perlu membuat instance kelas tertentu tergantung pada kondisi tertentu. Pabrik adalah pola desain yang membantu memecahkan masalah pembuatan objek yang berbeda tergantung pada kondisi tertentu. Abstrak, bukan? Kekhususan dan kejelasan lebih lanjut akan tampak ketika kita melihat contoh di bawah ini.
Kami membuat berbagai jenis kopi
Katakanlah kita ingin mengotomatisasi kedai kopi. Kita perlu belajar cara menyiapkan berbagai jenis kopi. Untuk melakukan ini, dalam aplikasi kita, kita akan membuat kelas kopi dan turunannya: Americano, cappuccino, espresso, latte - jenis kopi yang akan kita siapkan. Mari kita mulai dengan kelas kopi umum:public class Coffee {
public void grindCoffee(){
// перемалываем кофе
}
public void makeCoffee(){
// делаем кофе
}
public void pourIntoCup(){
// наливаем в чашку
}
}
Selanjutnya, mari kita buat ahli warisnya:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Pelanggan kami akan memesan beberapa jenis kopi, dan informasi ini perlu diteruskan ke program. Hal ini dapat dilakukan dengan berbagai cara, misalnya dengan menggunakan String
. Tapi ini paling cocok untuk tujuan ini enum
. Mari kita buat enum
dan tentukan di dalamnya jenis kopi yang kami terima pesanannya:
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
Bagus, sekarang mari kita 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("Вот ваш кофе! Спасибо, приходите еще!");
return coffee;
}
}
Metode ini orderCoffee
dapat dibagi menjadi dua komponen:
- Membuat instance kopi tertentu dalam satu blok
switch-case
. Di sinilah yang dilakukan Pabrik adalah pembuatan tipe tertentu tergantung kondisi. - Persiapannya sendiri adalah menggiling, memasak dan menuangkan ke dalam cangkir.
- Algoritme persiapannya sendiri (menggiling, memasak, dan menuangkan ke dalam cangkir) tidak akan berubah (setidaknya kami berharap demikian).
- Namun jenis kopinya bisa berubah. Mungkin kita akan mulai membuat mocha.. Mocha.. Mokkachi... Alhamdulillah, kopi jenis baru.
switch-case
. Mungkin juga di kedai kopi kita metode tersebut orderCoffee
bukan satu-satunya tempat kita membuat berbagai jenis kopi. Oleh karena itu, perubahan harus dilakukan di beberapa tempat. Anda mungkin sudah mengerti maksud saya. Kita perlu melakukan refaktorisasi. Pindahkan blok yang bertanggung jawab membuat kopi ke kelas terpisah karena dua alasan:
- Kita akan bisa menggunakan kembali logika menciptakan kopi di tempat lain.
- Jika rentangnya berubah, kita tidak perlu mengedit kode di mana pun kreasi kopi akan digunakan. Mengubah kode saja sudah cukup di satu tempat.
Kami sedang menggergaji pabrik pertama kami
Untuk melakukan ini, mari buat kelas baru yang hanya 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 menerapkan pola desain Pabrik dalam bentuk yang paling sederhana. Meskipun semuanya bisa menjadi lebih sederhana jika metodenya dibuat createCoffee
statis. Namun kita akan kehilangan dua kemungkinan:
- Mewarisi dari
SimpleCoffeeFactory
dan menimpacreateCoffee
. - Terapkan implementasi pabrik yang diperlukan di kelas kami.
Pengenalan pabrik menjadi kedai kopi
Mari kita menulis ulang kelas kedai kopi kita 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("Вот ваш кофе! Спасибо, приходите еще!");
return coffee;
}
}
Besar. Sekarang mari kita coba mendeskripsikan secara skematis dan ringkas struktur pola desain Pabrik.
5 langkah untuk membuka pabrik Anda sendiri
Langkah 1. Dalam program Anda, Anda memiliki kelas dengan beberapa turunan, seperti pada gambar di bawah ini: Langkah 2. Anda membuat kelasenum
di mana Anda mendefinisikan variabel enum untuk setiap kelas turunan:
enum CatType {
LION,
TIGER,
BARSIK
}
Langkah 3. Anda membangun pabrik Anda. Sebut saja MyClassFactory
, kodenya di bawah ini:
class CatFactory {}
Langkah 4. Anda membuat metode di pabrik Anda createMyClass
yang menggunakan variabel - enum
MyClassType
. Kode di bawah ini:
class CatFactory {
public Cat createCat(CatType type) {
}
}
Langkah 5. Anda menulis sebuah blok di badan metode switch-case
tempat Anda melakukan iterasi melalui semua nilai enum dan membuat instance kelas yang sesuai dengan enum
nilai tersebut:
class CatFactory {
public Cat createCat(CatType type) {
Cat cat = null;
switch (type) {
case LION:
cat = new Barsik();
break;
case TIGER:
cat = new Tiger();
break;
case BARSIK:
cat = new Lion();
break;
}
return cat;
}
}
Seperti Bos.
GO TO FULL VERSION