KodeGym/Blog Jawa/Acak/Pola desain: Pabrik abstrak
John Squirrels
tingkat
San Francisco

Pola desain: Pabrik abstrak

Diterbitake ing grup
Hi! Dina iki kita bakal terus sinau pola desain lan kita bakal ngrembug pola pabrik abstrak . Pola desain: Pabrik abstrak - 1Mangkene apa sing bakal kita bahas ing pawulangan:
  • Kita bakal ngrembug apa pabrik abstrak lan masalah apa sing ditanggulangi pola iki
  • Kita bakal nggawe kerangka aplikasi lintas platform kanggo pesen kopi liwat antarmuka pangguna
  • Kita bakal sinau instruksi babagan cara nggunakake pola iki, kalebu ndeleng diagram lan kode
  • Lan minangka bonus, pawulangan iki kalebu endhog Paskah sing didhelikake sing bakal mbantu sampeyan sinau babagan nggunakake Jawa kanggo nemtokake jeneng sistem operasi lan, gumantung saka asil, kanggo nindakake tumindak siji utawa liyane.
Kanggo ngerti pola iki kanthi lengkap, sampeyan kudu ngerti topik ing ngisor iki:
  • pusaka ing Jawa
  • kelas abstrak lan metode ing Jawa

Apa masalah sing ditindakake pabrik abstrak?

Pabrik abstrak, kaya kabeh pola pabrik, mbantu kita kanggo mesthekake yen obyek anyar bakal digawe kanthi bener. Kita nggunakake aplikasi kasebut kanggo ngatur "produksi" macem-macem kulawarga obyek sing gegandhengan. Macem-macem kulawarga obyek sing saling gegandhengan... Apa tegese? Aja kuwatir: ing praktik, kabeh luwih gampang tinimbang sing katon. Kanggo miwiti, apa sing bisa dadi kulawarga obyek sing saling gegandhengan? Contone, kita ngembangake strategi militer sing nglibatake sawetara jinis unit:
  • infantri
  • kavaleri
  • pemanah
Jinis-jinis unit kasebut saling gegandhèngan, amarga padha dadi tentara sing padha. Kita bisa ujar manawa kategori sing kasebut ing ndhuwur minangka kulawarga obyek sing gegandhengan. Kita ngerti iki. Nanging pola pabrik abstrak digunakake kanggo ngatur nggawe macem-macem kulawarga obyek interconnected. Ora ana sing rumit ing kene. Ayo diterusake karo conto strategi militer. Umumé, unit militèr kalebu sawetara partai sing perang. Gumantung ing sisih kang padha ing, Unit militèr bisa beda-beda Ngartekno ing katon. Prajurit mlaku, prajurit jaranan lan pemanah tentara Romawi ora padha karo prajurit Viking, prajurit jaranan lan pemanah. Ing strategi militer, prajurit saka macem-macem tentara minangka kulawarga sing beda-beda saka obyek sing saling gegandhengan. Bakal lucu yen programmer Kesalahan kasebut nyebabake prajurit nganggo seragam Prancis jaman Napoleon, musket siap, ditemokake mlaku ing antarane barisan infantri Romawi. Pola desain pabrik abstrak dibutuhake kanthi tepat kanggo ngrampungake masalah iki. Ora, ora masalah isin sing bisa teka saka lelungan wektu, nanging masalah nggawe macem-macem kelompok obyek sing saling gegandhengan. Pabrik abstrak nyedhiyakake antarmuka kanggo nggawe kabeh produk sing kasedhiya (kulawarga obyek). Pabrik abstrak biasane duwe sawetara implementasine. Saben wong tanggung jawab kanggo nggawe produk saka salah siji kulawarga. Strategi militer kita bakal kalebu pabrik abstrak sing nggawe prajurit sikil abstrak, pemanah, lan pasukan kavaleri, uga implementasi pabrik iki. Tuladhane, pabrik sing nggawe legionnaire Romawi lan pabrik sing nggawe prajurit Carthaginian. Abstraksi minangka prinsip panuntun paling penting ing pola iki. Klien pabrik nggarap pabrik lan produke mung liwat antarmuka abstrak. Akibaté, sampeyan ora kudu mikir babagan prajurit sing saiki digawe. Nanging, sampeyan ngirim tanggung jawab iki kanggo sawetara implementasi konkrit saka pabrik abstrak.

Ayo terus ngotomatisasi warung kopi kita

Ing wulangan pungkasan, kita sinau pola metode pabrik. Kita digunakake kanggo nggedhekake bisnis kopi lan mbukak sawetara lokasi anyar. Dina iki kita bakal terus modernisasi bisnis kita. Nggunakake pola pabrik abstrak, kita bakal nggawe dhasar kanggo aplikasi desktop anyar kanggo pesen kopi online. Nalika nulis aplikasi desktop, kita kudu tansah mikir babagan dhukungan lintas platform. Aplikasi kita kudu bisa digunakake ing macOS lan Windows (spoiler: Dhukungan kanggo Linux ditinggalake kanggo sampeyan nindakake minangka peer). Apa tampilan aplikasi kita? Cukup prasaja: bakal dadi formulir sing kalebu kolom teks, kolom pilihan, lan tombol. Yen sampeyan duwe pengalaman nggunakake sistem operasi sing beda-beda, sampeyan mesthi ngelingi yen tombol ing Windows diwenehi beda tinimbang ing Mac. Minangka kabeh liyane ... Inggih, ayo miwiti.
  • tombol
  • kolom teks
  • lapangan pilihan
Penafian: Ing saben antarmuka, kita bisa nemtokake cara kaya onClick, onValueChanged, utawa onInputChanged. Ing tembung liyane, kita bisa nemtokake cara sing bakal ngidini kita nangani macem-macem acara (mencet tombol, ngetik teks, milih nilai ing kothak pilihan). Kabeh iki sengaja diilangake ing kene supaya ora kakehan conto lan nggawe luwih jelas nalika 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 ing gaya sistem operasi. Kita bakal nulis kode 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 kita nindakake padha kanggo MacOS:
public class MacButton implements Button {
}

public class MacSelect implements Select {
}

public class MacTextField implements TextField {
}
Banget. Saiki kita bisa nerusake menyang pabrik abstrak, sing bakal nggawe kabeh jinis produk abstrak sing kasedhiya:
public interface GUIFactory {

    Button createButton();
    TextField createTextField();
    Select createSelect();

}
Paling apik. Kaya sing sampeyan ngerteni, kita durung nindakake apa-apa sing rumit. Kabeh sing nderek uga prasaja. Kanthi analogi karo produk, kita nggawe macem-macem implementasi pabrik kanggo saben OS. Ayo miwiti karo Windows:
public class WindowsGUIFactory implements GUIFactory {
    public WindowsGUIFactory() {
        System.out.println("Creating GUIFactory 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();
    }
}
Kita wis nambah sawetara output console ing cara lan konstruktor supaya luwih nggambarake apa sing kedadeyan. Saiki kanggo macOS:
public class MacGUIFactory implements GUIFactory {
    public MacGUIFactory() {
        System.out.println("Creating GUIFactory 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();
    }
}
Elinga yen saben teken cara nuduhake yen metode ngasilake jinis abstrak. Nanging ing njero metode, kita nggawe implementasi khusus produk. Iki minangka siji-sijine papan sing kita kontrol nggawe kasus tartamtu. Saiki wayahe nulis kelas kanggo formulir kasebut. Iki minangka kelas Java sing kolom minangka unsur antarmuka:
public class CoffeeOrderForm {
    private final TextField customerNameTextField;
    private final Select coffeeTypeSelect;
    private final Button orderButton;

    public CoffeeOrderForm(GUIFactory factory) {
        System.out.println("Creating coffee order form");
        customerNameTextField = factory.createTextField();
        coffeeTypeSelect = factory.createSelect();
        orderButton = factory.createButton();
    }
}
Pabrik abstrak sing nggawe unsur antarmuka diterusake menyang konstruktor formulir. Kita bakal ngliwati implementasi pabrik sing dibutuhake kanggo konstruktor supaya bisa nggawe unsur antarmuka kanggo OS tartamtu.
public class Application {
    private CoffeeOrderForm coffeeOrderForm;

    public void drawCoffeeOrderForm() {
        // Determine the name of the operating system through System.getProperty()
        String osName = System.getProperty("os.name").toLowerCase();
        GUIFactory guiFactory;

        if (osName.startsWith("win")) { // For Windows
            guiFactory = new WindowsGUIFactory();
        } else if (osName.startsWith("mac")) { // For Mac
            guiFactory = new MacGUIFactory();
        } else {
            System.out.println("Unknown OS. Unable to draw form :(");
            return;
        }
        coffeeOrderForm = new CoffeeOrderForm(guiFactory);
    }

    public static void main(String[] args) {
        Application application = new Application();
        application.drawCoffeeOrderForm();
    }
}
Yen kita mbukak aplikasi ing Windows, kita entuk output ing ngisor iki:
Creating GUIFactory for Windows OS
Creating coffee order 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 GUIFactory for macOS
Creating coffee order form
Creating TextField for macOS
Creating Select for macOS
Creating Button for macOS
Ing Linux:
Unknown OS. Unable to draw form :(
Lan saiki kita ngringkes. We wrote balung saka aplikasi basis GUI kang unsur antarmuka digawe khusus kanggo OS cocog. Kita bakal mbaleni kanthi ringkes apa sing wis digawe:
  • Kulawarga produk sing kalebu kolom input, kolom pilihan, lan tombol.
  • Implementasi beda saka kulawarga produk kanggo Windows lan macOS.
  • Pabrik abstrak sing nemtokake antarmuka kanggo nggawe produk kita.
  • Loro implementasine saka pabrik kita, saben tanggung jawab kanggo nggawe kulawarga tartamtu produk.
  • Wangun (kelas Jawa) sing kolom minangka unsur antarmuka abstrak sing diinisialisasi kanthi nilai sing dibutuhake ing konstruktor nggunakake pabrik abstrak.
  • Kelas aplikasi Ing kelas iki, kita nggawe formulir, ngliwati implementasi pabrik sing dikarepake menyang konstruktor.
Hasile yaiku kita ngetrapake pola pabrik abstrak.

Pabrik abstrak: carane nggunakake

Pabrik abstrak minangka pola desain kanggo ngatur nggawe macem-macem kulawarga produk tanpa diikat karo kelas produk konkrit. Nalika nggunakake pola iki, sampeyan kudu:
  1. Netepake kulawarga produk. Upaminipun kita duwe loro:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. Kanggo saben produk ing kulawarga, nemtokake kelas abstrak (antarmuka). Ing kasus kita, kita duwe:
    • ProductA
    • ProductB
  3. Ing saben kulawarga produk, saben produk kudu ngetrapake antarmuka sing ditetepake ing langkah 2.
  4. Nggawe pabrik abstrak, kanthi cara kanggo nggawe saben produk sing ditetepake ing langkah 2. Ing kasus kita, metode iki bakal dadi:
    • ProductA createProductA();
    • ProductB createProductB();
  5. Nggawe implementasi pabrik abstrak supaya saben implementasine ngontrol nggawe produk saka kulawarga siji. Kanggo nindakake iki, ing saben implementasine pabrik abstrak, sampeyan kudu ngleksanakake kabeh cara gaweyan supaya bisa nggawe lan ngasilake implementasi produk tartamtu.
Diagram UML ing ngisor iki nggambarake instruksi kasebut ing ndhuwur: Pola desain: Pabrik abstrak - 3Saiki kita bakal nulis kode miturut instruksi kasebut:
// Define common product interfaces
public interface ProductA {}
public interface ProductB {}

// Create various implementations (families) of our products
public class SpecificProductA1 implements ProductA {}
public class SpecificProductB1 implements ProductB {}

public class SpecificProductA2 implements ProductA {}
public class SpecificProductB2 implements ProductB {}

// Create an abstract factory
public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// Implement the abstract factory in order to create products in family 1
public class SpecificFactory1 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB1();
    }
}

// Implement the abstract factory in order to create products in family 2
public class SpecificFactory2 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB2();
    }
}

Peer

Kanggo nguatake materi, sampeyan bisa nindakake 2 perkara:
  1. Rampungake aplikasi pesenan kopi supaya uga bisa digunakake ing Linux.
  2. Gawe pabrik abstrak dhewe kanggo ngasilake unit sing melu strategi militer. Iki bisa uga minangka strategi militer sejarah sing melu tentara nyata, utawa fantasi karo orc, gnome, lan elf. Sing penting yaiku milih barang sing sampeyan minati. Dadi kreatif, cetak pesen ing konsol, lan seneng sinau babagan pola!
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar