Hai, kanca! Dina iki kita bakal terus sinau pola desain karo sampeyan. Ing kuliah iki kita bakal ngomong babagan Pabrik. Kita bakal ngrembug karo sampeyan apa masalah ditanggulangi nggunakake cithakan iki, lan katon ing conto carane pabrik mbantu mbukak warung kopi. Lan aku uga bakal menehi 5 langkah prasaja kanggo nggawe pabrik. Supaya ana ing kaca sing padha karo kabeh wong lan gampang ngerteni inti, sampeyan kudu ngerti topik ing ngisor iki:
- Pusaka ing Jawa
- Narrowing lan ngembangaken jinis referensi ing Jawa
- Interaksi antarane macem-macem kelas lan obyek
Apa iku Pabrik?
Pola desain Pabrik ngidini sampeyan ngontrol nggawe obyek. Proses nggawe obyek anyar ora prasaja, nanging uga ora rumit. Kita kabeh ngerti manawa kanggo nggawe obyek anyar kita kudu nggunakake filenew
. Lan iku uga koyone sing ana apa-apa kanggo ngatur kene, nanging iki ora supaya. Kesulitan bisa uga muncul nalika aplikasi kita duwe kelas tartamtu sing duwe akeh turunan, lan kudu nggawe conto kelas tartamtu gumantung ing sawetara kahanan. Pabrik minangka pola desain sing mbantu ngatasi masalah nggawe obyek sing beda-beda gumantung saka sawetara kondisi. Abstrak, ta? Luwih spesifik lan kajelasan bakal katon nalika ndeleng conto ing ngisor iki.
Kita nggawe macem-macem jinis kopi
Ayo kita ngomong yen kita pengin ngotomatisasi warung kopi. Kita kudu sinau carane nyiyapake macem-macem jinis kopi. Kanggo nindakake iki, ing aplikasi kita, kita bakal nggawe kelas kopi lan turunan: Americano, cappuccino, espresso, latte - jinis kopi sing bakal disiapake. Ayo miwiti karo kelas kopi umum:public class Coffee {
public void grindCoffee(){
// перемалываем кофе
}
public void makeCoffee(){
// делаем кофе
}
public void pourIntoCup(){
// наливаем в чашку
}
}
Sabanjure, ayo nggawe ahli waris:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Pelanggan bakal pesen sawetara jinis kopi, lan informasi iki kudu dikirim menyang program kasebut. Iki bisa ditindakake kanthi cara sing beda-beda, contone nggunakake String
. Nanging paling cocog kanggo tujuan kasebut enum
. Ayo nggawe enum
lan nemtokake jinis kopi sing ditampa pesenan:
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
Apik, saiki ayo nulis kode kanggo warung 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;
}
}
Cara kasebut orderCoffee
bisa dipérang dadi rong komponen:
- Nggawe conto kopi tartamtu ing blok
switch-case
. Ing kene apa sing ditindakake Pabrik yaiku nggawe jinis tartamtu gumantung saka kahanan. - Preparation dhewe mecah, masak lan pour menyang tuwung.
- Algoritma preparation dhewe (grinding, masak lan pour menyang tuwung) bakal tetep ora diganti (paling kita ngarep-arep supaya).
- Nanging macem-macem kopi bisa diganti. Muga-muga kita bakal miwiti nggawe mocha.. Mocha.. Mokkachi... Gusti mberkahi dheweke, jinis kopi anyar.
switch-case
. Bisa uga ing warung kopi kita, metode kasebut orderCoffee
ora mung minangka papan kanggo nggawe macem-macem jinis kopi. Mula, owah-owahan kudu ditindakake ing sawetara papan. Sampeyan mbokmenawa wis ngerti apa sing dakkarepake. Kita kudu refactor. Pindhah blok sing tanggung jawab kanggo nggawe kopi menyang kelas sing kapisah amarga rong alasan:
- Kita bakal bisa nggunakake maneh logika nggawe kopi ing papan liya.
- Yen sawetara owah-owahan, kita ora kudu ngowahi kode ing endi wae ing ngendi nggawe kopi bakal digunakake. Bakal cukup kanggo ngganti kode mung ing sak panggonan.
Kita sawing pabrik pisanan kita
Kanggo nindakake iki, ayo nggawe kelas anyar sing mung tanggung jawab kanggo nggawe kelas kopi sing dibutuhake: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;
}
}
Sugeng rawuh! Kita wis nerapake pola desain Pabrik kanthi bentuk sing paling gampang. Senajan kabeh bisa dadi luwih prasaja yen cara digawe createCoffee
statis. Nanging banjur kita bakal kelangan rong kemungkinan:
- Warisan saka
SimpleCoffeeFactory
lan nimpacreateCoffee
. - Ngleksanakake implementasi pabrik sing dibutuhake ing kelas kita.
Pengenalan pabrik menyang warung kopi
Ayo nulis ulang kelas warung kopi kita nggunakake 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;
}
}
Agung. Saiki ayo nyoba njlentrehake kanthi skematis lan ringkes struktur pola desain Pabrik.
5 langkah kanggo mbukak pabrik dhewe
Langkah 1. Ing program sampeyan duwe kelas karo sawetara keturunan, kaya ing gambar ing ngisor iki: Langkah 2. Sampeyan nggawe kelasenum
sing sampeyan nemtokake variabel enum kanggo saben kelas turunan:
enum CatType {
LION,
TIGER,
BARSIK
}
Langkah 3. Sampeyan mbangun pabrik sampeyan. Sampeyan nelpon MyClassFactory
, kode ing ngisor iki:
class CatFactory {}
Langkah 4. Sampeyan nggawe cara ing pabrik createMyClass
sing njupuk variabel - enum
MyClassType
. Kode ing ngisor iki:
class CatFactory {
public Cat createCat(CatType type) {
}
}
Langkah 5. Sampeyan nulis pemblokiran ing awak saka cara switch-case
kang iterate liwat kabeh nilai enum lan nggawe Kayata saka kelas cocog karo 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;
}
}
Kaya bos.
GO TO FULL VERSION