Hai kawan! Hari ini kami akan terus mengkaji corak reka bentuk dengan anda. Dalam kuliah ini kita akan bercakap tentang Kilang. Kami akan berbincang dengan anda tentang masalah yang diselesaikan menggunakan templat ini, dan lihat contoh cara kilang membantu membuka kedai kopi. Dan saya juga akan memberikan anda 5 langkah mudah untuk membuat kilang. Untuk berada di halaman yang sama dengan semua orang dan mudah memahami intipati, anda harus biasa dengan topik berikut:
- Warisan di Jawa
- Mengecilkan dan mengembangkan jenis rujukan dalam Java
- Interaksi antara kelas dan objek yang berbeza
Apa itu Kilang?
Corak reka bentuk Kilang membolehkan anda mengawal penciptaan objek. Proses mencipta objek baharu tidak semudah itu, tetapi ia juga tidak terlalu rumit. Kita semua tahu bahawa untuk mencipta objek baru kita mesti menggunakannew
. Dan nampaknya tiada apa yang perlu diuruskan di sini, tetapi ini tidak begitu. Kesukaran mungkin timbul apabila aplikasi kita mempunyai kelas tertentu yang mempunyai banyak keturunan, dan adalah perlu untuk mencipta contoh kelas tertentu bergantung pada beberapa syarat. Kilang ialah corak reka bentuk yang membantu menyelesaikan masalah mencipta objek berbeza bergantung pada beberapa keadaan. Abstrak, bukan? Lebih kekhususan dan kejelasan akan muncul apabila kita melihat contoh di bawah.
Kami mencipta pelbagai jenis kopi
Katakan kita mahu mengautomasikan kedai kopi. Kita perlu belajar cara menyediakan pelbagai jenis kopi. Untuk melakukan ini, dalam aplikasi kami, kami akan mencipta kelas kopi dan derivatifnya: Americano, cappuccino, espresso, latte - jenis kopi yang akan kami sediakan. Mari kita mulakan dengan kelas kopi umum:public class Coffee {
public void grindCoffee(){
// перемалываем кофе
}
public void makeCoffee(){
// делаем кофе
}
public void pourIntoCup(){
// наливаем в чашку
}
}
Seterusnya, mari kita cipta pewarisnya:
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 maklumat ini perlu dihantar kepada program. Ini boleh dilakukan dengan cara yang berbeza, contohnya menggunakan String
. Tetapi ia paling sesuai untuk tujuan ini enum
. Mari kita cipta enum
dan tentukan di dalamnya jenis kopi yang kami terima tempahan:
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
Bagus, sekarang mari tulis kod untuk kedai kopi kami:
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;
}
}
Kaedah orderCoffee
boleh dibahagikan kepada dua komponen:
- Mencipta contoh kopi tertentu dalam blok
switch-case
. Di sinilah apa yang Kilang lakukan adalah penciptaan jenis tertentu bergantung pada syarat. - Penyediaan itu sendiri adalah mengisar, memasak dan menuang ke dalam cawan.
- Algoritma penyediaan itu sendiri (mengisar, memasak dan menuang ke dalam cawan) akan kekal tidak berubah (sekurang-kurangnya kami berharap begitu).
- Tetapi julat kopi mungkin berubah. Mungkin kita akan mula membuat mocha.. Mocha.. Mokkachi... Tuhan memberkati dia, jenis kopi baru.
switch-case
. Ia juga mungkin bahawa di kedai kopi kami kaedah itu orderCoffee
bukan satu-satunya tempat di mana kami mencipta pelbagai jenis kopi. Oleh itu, perubahan perlu dibuat di beberapa tempat. Anda mungkin sudah faham apa yang saya maksudkan. Kita perlu memfaktorkan semula. Alihkan blok yang bertanggungjawab untuk mencipta kopi ke dalam kelas yang berasingan atas dua sebab:
- Kami akan dapat menggunakan semula logik mencipta kopi di tempat lain.
- Jika julat berubah, kami tidak perlu mengedit kod di mana-mana tempat penciptaan kopi akan digunakan. Ia akan mencukupi untuk menukar kod di satu tempat sahaja.
Kami sedang menggergaji kilang pertama kami
Untuk melakukan ini, mari buat kelas baharu yang akan bertanggungjawab hanya untuk mencipta contoh 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;
}
}
tahniah! Kami baru sahaja melaksanakan corak reka bentuk Kilang dalam bentuk yang paling mudah. Walaupun semuanya boleh menjadi lebih mudah jika kaedah itu dibuat createCoffee
statik. Tetapi kemudian kita akan kehilangan dua kemungkinan:
- Warisi daripada
SimpleCoffeeFactory
dan gantikancreateCoffee
. - Laksanakan pelaksanaan kilang yang diperlukan dalam kelas kami.
Pengenalan kilang ke kedai kopi
Mari tulis semula kelas kedai kopi kami menggunakan kilang: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;
}
}
Hebat. Sekarang mari kita cuba menerangkan secara skematik dan padat struktur corak reka bentuk Kilang.
5 langkah membuka kilang sendiri
Langkah 1. Dalam program anda, anda mempunyai kelas dengan beberapa keturunan, seperti dalam gambar di bawah: Langkah 2. Anda mencipta kelasenum
di mana anda menentukan pembolehubah enum untuk setiap kelas keturunan:
enum CatType {
LION,
TIGER,
BARSIK
}
Langkah 3. Anda membina kilang anda. Anda memanggilnya MyClassFactory
, kod di bawah:
class CatFactory {}
Langkah 4. Anda mencipta kaedah di kilang anda createMyClass
yang mengambil pembolehubah - enum
MyClassType
. Kod di bawah:
class CatFactory {
public Cat createCat(CatType type) {
}
}
Langkah 5. Anda menulis blok dalam badan kaedah switch-case
di mana anda melelar melalui semua nilai enum dan mencipta contoh kelas yang sepadan dengan enum
nilai:
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;
}
}
Macam bos.
GO TO FULL VERSION