Hello! Dina iki kita bakal terus sinau pola desain lan ngomong babagan pabrik abstrak . Apa sing bakal kita lakoni sajrone ceramah:
- Ayo ngrembug apa pabrik abstrak lan masalah apa sing dipecahake pola iki;
- kita bakal nggawe kerangka aplikasi lintas platform kanggo pesen kopi kanthi antarmuka pangguna;
- Ayo sinau pandhuan kanggo nggunakake pola iki kanthi diagram lan kode;
- Minangka bonus, ana endhog Paskah sing didhelikake ing kuliah, amarga sampeyan bakal sinau kanggo nemtokake jeneng sistem operasi nggunakake Jawa lan, gumantung saka asil, nindakake siji utawa tumindak liyane.
- pusaka ing Jawa;
- kelas abstrak lan metode ing Jawa.
Masalah apa sing diatasi dening pola pabrik abstrak?
Pabrik abstrak, kaya kabeh pola pabrik, mbantu kita ngatur nggawe obyek anyar kanthi bener. Kanthi bantuan, kita ngatur "rilis" macem-macem kulawarga obyek sing saling gegandhengan. Macem-macem kulawarga obyek sing saling gegandhengan...Apa iku? Aja kuwatir: ing praktik, kabeh luwih gampang tinimbang sing katon. Ayo dadi miwiti karo apa sing bisa dadi kulawarga obyek sing gegandhengan? Umpama sampeyan lan aku nggawe strategi, lan ana sawetara unit tempur ing kono:- infantri;
- kavaleri;
- pemanah.
Kita terus ngotomatisasi warung kopi
Ing kuliah pungkasan, kita sinau pola metode pabrik, kanthi bantuan kita bisa ngembangake bisnis kopi lan mbukak sawetara titik dodolan kopi anyar. Dina iki kita bakal nerusake karya kanggo modernisasi bisnis kita. Nggunakake pola pabrik abstrak, kita bakal nggawe dhasar kanggo aplikasi desktop anyar kanggo pesen kopi online. Nalika kita nulis aplikasi kanggo desktop, kita kudu tansah mikir babagan lintas-platform. Aplikasi kita kudu bisa digunakake ing macOS lan Windows (spoiler: Linux bakal ditinggalake kanggo sampeyan minangka peer). Apa tampilan aplikasi kita? Cukup prasaja: iki bakal dadi formulir sing kalebu kolom teks, kolom pilih, lan tombol. Yen sampeyan duwe pengalaman nggunakake sistem operasi sing beda-beda, sampeyan mesthi ngerteni manawa ing Windows, tombol-tombol kasebut beda karo ing Mac. Kaya kabeh liyane ... Dadi, ayo miwiti. Ing peran kulawarga produk, kaya sing sampeyan wis ngerti, kita bakal duwe unsur antarmuka grafis:- tombol;
- kolom teks;
- lapangan kanggo pilihan.
onClick
, onValueChanged
utawa onInputChanged
. Sing. cara sing bakal ngidini kita kanggo nangani macem-macem acara (ngeklik tombol, ngetik teks, milih nilai ing kothak pilih). Kabeh iki sengaja diilangi supaya ora kakehan conto lan nggawe luwih visual kanggo sinau pola pabrik. Ayo nemtokake antarmuka abstrak kanggo produk kita:
public interface Button {}
public interface Select {}
public interface TextField {}
Kanggo saben sistem operasi, kita kudu nggawe unsur antarmuka kanthi gaya sistem operasi kasebut. Kita nulis kanggo Windows lan MacOS. Ayo nggawe implementasine kanggo Windows:
public class WindowsButton implements Button {
}
public class WindowsSelect implements Select {
}
public class WindowsTextField implements TextField {
}
Saiki padha kanggo MacOS:
public class MacButton implements Button {
}
public class MacSelect implements Select {
}
public class MacTextField implements TextField {
}
Agung. Saiki kita bisa miwiti pabrik abstrak, sing bakal nggawe kabeh jinis produk abstrak sing ana:
public interface GUIFactory {
Button createButton();
TextField createTextField();
Select createSelect();
}
Sempurno. Nalika sampeyan bisa ndeleng, ora ana sing rumit nganti saiki. Banjur kabeh kaya prasaja. Kanthi analogi karo produk, kita nggawe implementasine pabrik sing beda kanggo saben OS. Ayo miwiti karo Windows:
public class WindowsGUIFactory implements GUIFactory {
public WindowsGUIFactory() {
System.out.println("Creating gui factory for Windows OS");
}
public Button createButton() {
System.out.println("Creating Button for Windows OS");
return new WindowsButton();
}
public TextField createTextField() {
System.out.println("Creating TextField for Windows OS");
return new WindowsTextField();
}
public Select createSelect() {
System.out.println("Creating Select for Windows OS");
return new WindowsSelect();
}
}
Output konsol ing metode lan konstruktor wis ditambahake kanggo nduduhake cara kerjane. Saiki kanggo macOS:
public class MacGUIFactory implements GUIFactory {
public MacGUIFactory() {
System.out.println("Creating gui factory for macOS");
}
@Override
public Button createButton() {
System.out.println("Creating Button for macOS");
return new MacButton();
}
@Override
public TextField createTextField() {
System.out.println("Creating TextField for macOS");
return new MacTextField();
}
@Override
public Select createSelect() {
System.out.println("Creating Select for macOS");
return new MacSelect();
}
}
Cathetan: saben metode, miturut teken, ngasilake jinis abstrak. Nanging nang cara kita nggawe implementasi konkrit saka produk. Iki minangka siji-sijine papan ing ngendi kita ngontrol nggawe kasus tartamtu. Saiki wektune nulis kelas formulir. Iki minangka kelas Java sing kolom minangka unsur antarmuka:
public class OrderCoffeeForm {
private final TextField customerNameTextField;
private final Select coffeTypeSelect;
private final Button orderButton;
public OrderCoffeeForm(GUIFactory factory) {
System.out.println("Creating order coffee form");
customerNameTextField = factory.createTextField();
coffeTypeSelect = factory.createSelect();
orderButton = factory.createButton();
}
}
Pabrik abstrak diterusake menyang konstruktor formulir, sing nggawe unsur antarmuka. Kita bakal ngliwati implementasi pabrik sing dibutuhake menyang konstruktor supaya bisa nggawe unsur antarmuka kanggo OS tartamtu.
public class Application {
private OrderCoffeeForm orderCoffeeForm;
public void drawOrderCoffeeForm() {
// Определим Name операционной системы, получив meaning системной проперти через System.getProperty
String osName = System.getProperty("os.name").toLowerCase();
GUIFactory guiFactory;
if (osName.startsWith("win")) { // Для windows
guiFactory = new WindowsGUIFactory();
} else if (osName.startsWith("mac")) { // Для mac
guiFactory = new MacGUIFactory();
} else {
System.out.println("Unknown OS, can't draw form :( ");
return;
}
orderCoffeeForm = new OrderCoffeeForm(guiFactory);
}
public static void main(String[] args) {
Application application = new Application();
application.drawOrderCoffeeForm();
}
}
Yen kita mbukak aplikasi ing Windows, kita bakal entuk output ing ngisor iki:
Creating gui factory for Windows OS
Creating order coffee form
Creating TextField for Windows OS
Creating Select for Windows OS
Creating Button for Windows OS
Ing Mac, output bakal kaya ing ngisor iki:
Creating gui factory for macOS
Creating order coffee form
Creating TextField for macOS
Creating Select for macOS
Creating Button for macOS
Ing Linux:
Unknown OS, can't draw form :(
Inggih, kula lan panjenengan damel kesimpulan ing ngisor iki. We wrote framework kanggo aplikasi GUI sing nggawe persis unsur antarmuka sing cocok kanggo OS tartamtu. Ayo baleni sedhela apa sing digawe:
- Kulawarga produk: kolom input, kolom pilihan lan tombol.
- Macem-macem implementasi saka kulawarga produk iki, kanggo Windows lan macOS.
- Pabrik abstrak, ing ngendi kita nemtokake antarmuka kanggo nggawe produk kita.
- Loro implementasine saka pabrik kita, saben kang tanggung jawab kanggo nggawe kulawarga tartamtu saka produk.
- Wangun, kelas Jawa sing kolom minangka unsur antarmuka abstrak sing diinisialisasi ing konstruktor kanthi nilai sing dibutuhake nggunakake pabrik abstrak.
- Kelas aplikasi. Ing njero, kita nggawe formulir sing bakal ditindakake pabrik sing dibutuhake kanggo konstruktor.
Pabrik Abstrak: pandhuan kanggo nggunakake
Pabrik Abstrak minangka pola desain kanggo ngatur nggawe kulawarga produk sing beda-beda tanpa diikat karo kelas produk tartamtu. Nalika nggunakake cithakan iki, sampeyan kudu:- Nemtokake kulawarga produk dhewe. Ayo nganggep kita duwe loro:
SpecificProductA1
,SpecificProductB1
SpecificProductA2
,SpecificProductB2
- Kanggo saben produk ing kulawarga, nemtokake kelas abstrak (antarmuka). Ing kasus kita yaiku:
ProductA
ProductB
- Ing saben kulawarga produk, saben produk kudu ngetrapake antarmuka sing ditetepake ing langkah 2.
- Nggawe pabrik abstrak, kanthi nggawe metode kanggo saben produk sing ditetepake ing langkah 2. Ing kasus kita, metode iki bakal dadi:
ProductA createProductA();
ProductB createProductB();
- Nggawe implementasi saka pabrik abstrak supaya saben implementasine ngontrol nggawe produk saka kulawarga padha. Kanggo nindakake iki, ing saben implementasine pabrik abstrak, perlu kanggo ngleksanakake kabeh cara nggawe, supaya implementasi konkrit saka produk digawe lan bali menyang.
// Определим общие интерфейсы продуктов
public interface ProductA {}
public interface ProductB {}
// Создадим различные реализации (семейства) наших продуктов
public class SpecificProductA1 implements ProductA {}
public class SpecificProductB1 implements ProductB {}
public class SpecificProductA2 implements ProductA {}
public class SpecificProductB2 implements ProductB {}
// Создадим абстрактную фабрику
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// Создадим реализацию абстрактной фабрики для создания продуктов семейства 1
public class SpecificFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new SpecificProductA1();
}
@Override
public ProductB createProductB() {
return new SpecificProductB1();
}
}
// Создадим реализацию абстрактной фабрики для создания продуктов семейства 1
public class SpecificFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new SpecificProductA2();
}
@Override
public ProductB createProductB() {
return new SpecificProductB2();
}
}
Peer
Kanggo nggabungake materi sampeyan bisa nindakake 2 perkara:- Ngapikake aplikasi pesen kopi supaya bisa digunakake ing Linux.
- Gawe pabrik abstrak dhewe kanggo ngasilake unit strategi apa wae. Iki bisa dadi strategi sejarah karo tentara nyata utawa fantasi karo orc, kurcaci lan elf. Ingkang utama yaiku sampeyan nemokake iku menarik. Nggawe kreatif, kirim pin menyang konsol, lan seneng-seneng sinau pola!
GO TO FULL VERSION