Hello! Dina iki kita bakal terus sinau pola desain lan ngomong babagan metode pabrik (FactoryMethod). Sampeyan bakal ngerti apa iku lan apa tugas cithakan iki cocok kanggo. Kita bakal nliti pola desain iki ing praktik lan njelajah strukture. Kanggo nggawe kabeh ing ndhuwur cetha kanggo sampeyan, sampeyan kudu ngerti topik ing ngisor iki:
- Pusaka ing Jawa.
- Metode lan kelas abstrak ing basa Jawa.
Apa masalah cara pabrik ngatasi?
Ing kabeh pola desain pabrik, ana rong klompok peserta - pencipta (pabrik dhewe) lan produk (obyek sing digawe pabrik). Bayangake kahanan: kita duwe pabrik sing ngasilake mobil miturut merek AutoRush. Dheweke ngerti carane nggawe model mobil kanthi macem-macem jinis awak:- sedan
- gerbong stasiun
- coupe
- Sedan AutoRush Kab
- AutoRush station wagon
- coupe AutoRush
- sedan OneAuto
- OneAuto station wagon
- coupe OneAuto
A sethitik babagan cithakan pabrik
Ayo kula ngelingake sampeyan: kita mbangun warung kopi virtual cilik karo sampeyan. Ing kono, kita sinau carane nggawe macem-macem jinis kopi nggunakake pabrik sing prasaja. Dina iki kita bakal nyaring conto iki. Ayo padha elinga kaya apa warung kopi kita kanthi pabrik sing prasaja. Kita duwe kelas kopi:public class Coffee {
public void grindCoffee(){
// перемалываем кофе
}
public void makeCoffee(){
// делаем кофе
}
public void pourIntoCup(){
// наливаем в чашку
}
}
Lan uga sawetara ahli waris - jinis kopi tartamtu sing bisa diprodhuksi pabrik kita:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Kanggo penak nampa pesenan, kita wis ngenalake transfer:
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
Pabrik kopi dhewe katon kaya mangkene:
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 Cappuccino();
break;
case CAFFE_LATTE:
coffee = new CaffeLatte();
break;
}
return coffee;
}
}
Lan pungkasane, warung kopi dhewe:
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;
}
}
Modernisasi pabrik prasaja
Warung kopi kita apik. Dadi akeh supaya kita mikir babagan ngembangake. Kita pengin mbukak sawetara titik anyar. Minangka wong sing enterprising, kita ora bakal nggawe warung kopi monoton. Aku pengin saben wong duwe twist dhewe. Mulane, kanggo miwiti, kita bakal mbukak rong titik: ing gaya Italia lan Amerika. Owah-owahan bakal mengaruhi ora mung interior, nanging uga ombenan:- ing warung kopi Italia, kita bakal nggunakake merek kopi khusus Italia, kanthi grinding lan roasting khusus.
- Bagian Amerika bakal dadi luwih gedhe, lan saben pesenan kita bakal ngawula marshmallow sing ilang - marshmallow.
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Lan dadi 8:
public class ItalianStyleAmericano extends Coffee {}
public class ItalianStyleCappucino extends Coffee {}
public class ItalianStyleCaffeLatte extends Coffee {}
public class ItalianStyleEspresso extends Coffee {}
public class AmericanStyleAmericano extends Coffee {}
public class AmericanStyleCappucino extends Coffee {}
public class AmericanStyleCaffeLatte extends Coffee {}
public class AmericanStyleEspresso extends Coffee {}
Amarga kita pengin supaya model bisnis saiki ora diganti, kita pengin cara orderCoffee(CoffeeType type)
ngalami owah-owahan minimal. Ayo dideleng:
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = coffeeFactory.createCoffee(type);
coffee.grindCoffee();
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Вот ваш кофе! Спасибо, приходите еще!");
return coffee;
}
Apa pilihan sing kita duwe? Kita wis ngerti carane nulis pabrik, ta? Wangsulan: Bab ingkang paling prasaja sing langsung teka ing atine kanggo nulis loro pabrik padha, lan banjur pass implementasine dibutuhake kanggo warung kopi kita ing konstruktor. Banjur kelas warung kopi ora owah. Kaping pisanan, kita kudu nggawe kelas pabrik anyar, entuk warisan saka pabrik sing prasaja lan ngilangi createCoffee (CoffeeType type)
. Ayo nulis pabrik kanggo nggawe kopi ing gaya Italia lan Amerika:
public class SimpleItalianCoffeeFactory extends SimpleCoffeeFactory {
@Override
public Coffee createCoffee (CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new ItalianStyleAmericano();
break;
case ESPRESSO:
coffee = new ItalianStyleEspresso();
break;
case CAPPUCCINO:
coffee = new ItalianStyleCappuccino();
break;
case CAFFE_LATTE:
coffee = new ItalianStyleCaffeLatte();
break;
}
return coffee;
}
}
public class SimpleAmericanCoffeeFactory extends SimpleCoffeeFactory{
@Override
public Coffee createCoffee (CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new AmericanStyleAmericano();
break;
case ESPRESSO:
coffee = new AmericanStyleEspresso();
break;
case CAPPUCCINO:
coffee = new AmericanStyleCappuccino();
break;
case CAFFE_LATTE:
coffee = new AmericanStyleCaffeLatte();
break;
}
return coffee;
}
}
Saiki kita bisa ngirim implementasi pabrik sing dibutuhake menyang CoffeeShop. Ayo ndeleng kaya apa kode pesenan kopi saka macem-macem warung kopi. Contone, cappuccino ing gaya Italia lan Amerika:
public class Main {
public static void main(String[] args) {
/*
Закажем капучино в итальянском стиле:
1. Создадим фабрику для приготовления итальянского кофе
2. Создадим новую кофейню, передав ей в конструкторе фабрику итальянского кофе
3. Закажем наш кофе
*/
SimpleItalianCoffeeFactory italianCoffeeFactory = new SimpleItalianCoffeeFactory();
CoffeeShop italianCoffeeShop = new CoffeeShop(italianCoffeeFactory);
italianCoffeeShop.orderCoffee(CoffeeType.CAPPUCCINO);
/*
Закажем капучино в американском стиле
1. Создадим фабрику для приготовления американского кофе
2. Создадим новую кофейню, передав ей в конструкторе фабрику американского кофе
3. Закажем наш кофе
*/
SimpleAmericanCoffeeFactory americanCoffeeFactory = new SimpleAmericanCoffeeFactory();
CoffeeShop americanCoffeeShop = new CoffeeShop(americanCoffeeFactory);
americanCoffeeShop.orderCoffee(CoffeeType.CAPPUCCINO);
}
}
Kita nggawe rong toko kopi sing beda-beda, nransfer saben menyang pabrik sing dibutuhake. Ing tangan siji, kita wis entuk gol kita, nanging ing sisih liya ... Ana sing ngeruk jiwa pengusaha sing ora bisa ditahan ... Ayo ngerteni apa sing salah. Kaping pisanan, akeh pabrik. Apa bisa nggawe pabrik dhewe saben wektu kanggo titik anyar lan, saliyane, priksa manawa nalika nggawe warung kopi, pabrik sing dibutuhake ditransfer menyang konstruktor? Kapindho, isih pabrik sing prasaja. Mung rada modern. Kita isih sinau pola anyar ing kene. Katelu, apa ora bisa ditindakake kanthi cara sing beda? Iku bakal kelangan yen kita bisa localize kabeh pitakonan babagan nggawe kopi nang kelas CoffeeShop
, ngubungake proses nggawe kopi lan servicing pesenan, nanging ing wektu sing padha njaga cukup keluwesan kanggo nggawe kopi ing macem-macem gaya. Jawabane ya, sampeyan bisa. Iki diarani pola desain metode pabrik.
Saka pabrik sing prasaja nganti cara pabrik
Kanggo ngatasi masalah kanthi efisien, kita:- Ayo bali metode
createCoffee(CoffeeType type)
menyang kelasCoffeeShop
. - Ayo nggawe cara iki abstrak.
- Kelas dhewe
CoffeeShop
bakal dadi abstrak. - Kelas
CoffeeShop
bakal duwe ahli waris.
CoffeeShop
, ngetrapake metode createCoffee(CoffeeType type)
sing cocog karo tradhisi barista Italia sing paling apik. Dadi, supaya. Langkah 1. Ayo nggawe kelas Coffee
abstrak. Saiki kita duwe rong kulawarga produk sing beda. Ombenan kopi Italia lan Amerika isih nuduhake leluhur sing padha: ing Coffee
. Iku bakal bener kanggo nggawe abstrak:
public abstract class Coffee {
public void makeCoffee(){
// делаем кофе
}
public void pourIntoCup(){
// наливаем в чашку
}
}
Langkah 2. Nggawe CoffeeShop
abstrak, kanthi metode abstrakcreateCoffee(CoffeeType type)
public abstract class CoffeeShop {
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = createCoffee(type);
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Вот ваш кофе! Спасибо, приходите еще!");
return coffee;
}
protected abstract Coffee createCoffee(CoffeeType type);
}
Langkah 3. Nggawe warung kopi Italia, kelas turunan saka warung kopi abstrak. Ing kana kita ngetrapake metode kasebut createCoffee(CoffeeType type)
kanthi nganggep spesifik Italia.
public class ItalianCoffeeShop extends CoffeeShop {
@Override
public Coffee createCoffee (CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new ItalianStyleAmericano();
break;
case ESPRESSO:
coffee = new ItalianStyleEspresso();
break;
case CAPPUCCINO:
coffee = new ItalianStyleCappuccino();
break;
case CAFFE_LATTE:
coffee = new ItalianStyleCaffeLatte();
break;
}
return coffee;
}
}
Langkah 4. Ayo padha kanggo warung kopi gaya Amerika.
public class AmericanCoffeeShop extends CoffeeShop {
@Override
public Coffee createCoffee (CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new AmericanStyleAmericano();
break;
case ESPRESSO:
coffee = new AmericanStyleEspresso();
break;
case CAPPUCCINO:
coffee = new AmericanStyleCappuccino();
break;
case CAFFE_LATTE:
coffee = new AmericanStyleCaffeLatte();
break;
}
return coffee;
}
}
Langkah 5. Ayo dipikirake kaya apa pesen latte gaya Amerika lan Italia:
public class Main {
public static void main(String[] args) {
CoffeeShop italianCoffeeShop = new ItalianCoffeeShop();
italianCoffeeShop.orderCoffee(CoffeeType.CAFFE_LATTE);
CoffeeShop americanCoffeeShop = new AmericanCoffeeShop();
americanCoffeeShop.orderCoffee(CoffeeType.CAFFE_LATTE);
}
}
Sugeng. Kita mung ngetrapake pola desain metode pabrik ing warung kopi.
Cara kerjane cara pabrik
Saiki ayo dideleng kanthi luwih cetha babagan apa sing diduweni. Diagram ing ngisor iki nuduhake kelas asil. Blok ijo minangka kelas pencipta, blok biru minangka kelas produk. Apa kesimpulan sing bisa ditindakake?- Kabeh produk minangka implementasi saka kelas abstrak
Coffee
. - Kabeh pangripta minangka implementasi saka kelas abstrak
CoffeeShop
. - Kita mirsani rong hierarki kelas paralel:
- Hierarki produk. Kita ndeleng keturunan Italia lan keturunan Amerika
- Hierarki pangripta. Kita ndeleng keturunan Italia lan keturunan Amerika
- Superclass
CoffeeShop
ora duwe informasi babagan implementasi produk tartamtu (Coffee
) sing bakal digawe. - Superclass
CoffeeShop
utusan nggawe produk tartamtu kanggo turunane. - Saben kelas turunan
CoffeeShop
ngleksanakake cara pabrikcreateCoffee()
sesuai karo spesifike. Ing tembung liyane, ing implementasine kelas pencipta, keputusan digawe kanggo nyiapake produk tartamtu adhedhasar spesifik kelas pencipta.
Struktur metode pabrik
Diagram ing ndhuwur nuduhake struktur umum pola metode pabrik. Apa maneh sing penting ing kene?- Kelas Creator ngemot implementasi kabeh metode sing sesambungan karo produk, kajaba metode pabrik.
- Cara abstrak
factoryMethod()
kudu ditindakake dening kabeh turunan kelasCreator
. - Kelas kasebut
ConcreteCreator
ngetrapake metodefactoryMethod()
sing langsung ngasilake produk. - Kelas iki tanggung jawab kanggo nggawe produk tartamtu. Iki minangka siji-sijine kelas kanthi informasi babagan nggawe produk kasebut.
- Kabeh produk kudu ngetrapake antarmuka umum - dadi turunan saka kelas produk umum. Iki perlu supaya kelas sing nggunakake produk bisa digunakake ing tingkat abstraksi tinimbang implementasi konkrit.
GO TO FULL VERSION