JavaRush /Blog Jawa /Random-JV /Pola Desain: AbstractFactory

Pola Desain: AbstractFactory

Diterbitake ing grup
Hello! Dina iki kita bakal terus sinau pola desain lan ngomong babagan pabrik abstrak . Pola Desain: AbstractFactory - 1Apa 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.
Kanggo ngerti pola iki kanthi lengkap, sampeyan kudu ngerti babagan topik ing ngisor iki:
  • 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.
Jinis-jinis unit tempur iki ana hubungane karo siji liyane, amarga padha ngawula ing tentara sing padha. Kita bisa ujar manawa kategori sing kadhaptar ing ndhuwur minangka kulawarga obyek sing gegandhengan. Sing diurutake. Nanging pola pabrik abstrak digunakake kanggo ngatur nggawe macem-macem kulawarga obyek interconnected. Ora ana sing rumit ing kene. Ayo dadi terus conto karo strategi. Padha biasane duwe sawetara sisih ngelawan beda. Unit tempur sing beda-beda bisa beda-beda ing tampilan. Prajurit mlaku, prajurit jaranan lan pemanah tentara Romawi ora padha karo prajurit mlaku, prajurit jaranan lan pemanah saka Viking. Ing kerangka strategi, prajurit saka tentara sing beda-beda minangka kulawarga sing beda-beda saka obyek sing saling gegandhengan. Bakal lucu yen, kanthi kesalahan programmer, prajurit nganggo seragam Prancis saka jaman Napoleon, kanthi musket siap, mlaku-mlaku ing antarane infantri Romawi. Kanggo ngatasi masalah kasebut, pola desain pabrik abstrak dibutuhake. Ora, ora masalah wektu travel isin, nanging nitahaken saka macem-macem kelompok obyek interconnected. Pabrik abstrak nyedhiyakake antarmuka kanggo nggawe kabeh produk sing ana (obyek kulawarga). Pabrik abstrak biasane duwe sawetara implementasine. Saben wong tanggung jawab kanggo nggawe produk saka salah sawijining variasi. Minangka bagéan saka strategi, kita bakal duwe pabrik abstrak sing nggawe infantri abstrak, pemanah lan kavaleri, uga implementasine saka pabrik iki. Pabrik sing nggawe legiun Romawi lan, contone, pabrik sing nggawe prajurit Carthaginian. Abstraksi minangka prinsip paling penting saka pola iki. Klien pabrik nggarap lan karo produk mung liwat antarmuka abstrak. Mulane, kita ora kudu mikir apa jenis warriors kita saiki nggawe, nanging nransfer tanggung jawab iki kanggo sawetara implementasine tartamtu saka pabrik abstrak.

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.
Penafian. Ing saben antarmuka kita bisa nemtokake cara kaya onClick, onValueChangedutawa 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.
Total: kita wis ngetrapake pola pabrik abstrak.

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:
  1. Nemtokake kulawarga produk dhewe. Ayo nganggep kita duwe loro:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. Kanggo saben produk ing kulawarga, nemtokake kelas abstrak (antarmuka). Ing kasus kita yaiku:
    • ProductA
    • ProductB
  3. Ing saben kulawarga produk, saben produk kudu ngetrapake antarmuka sing ditetepake ing langkah 2.
  4. 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();
  5. 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.
Ing ngisor iki diagram UML sing nggambarake instruksi kasebut ing ndhuwur: Pola Desain: AbstractFactory - 3Saiki ayo nulis kode kanggo instruksi iki:
// Определим общие интерфейсы продуктов
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:
  1. Ngapikake aplikasi pesen kopi supaya bisa digunakake ing Linux.
  2. 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!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION