JavaRush /Java Blog /Random-TK /Dizaýn nagyşlary: Abstrakt zawod

Dizaýn nagyşlary: Abstrakt zawod

Toparda çap edildi
Salam! Bu gün dizaýn nagyşlaryny öwrenmegi we abstrakt zawod hakda gürleşmegi dowam etdireris . Dizaýn nagyşlary: Abstrakt zawod - 1Leksiýa wagtynda näme ederis:
  • Abstrakt zawodyň nämedigini we bu nagşyň haýsy meseläni çözýändigini ara alyp maslahatlaşalyň;
  • ulanyjy interfeýsi bilen kofe sargyt etmek üçin platforma programmasynyň çarçuwasyny dörederis;
  • Geliň, bu nagşy diagramma we kod bilen ulanmak boýunça görkezmeleri öwreneliň;
  • Bonus hökmünde leksiýada Pasha ýumurtgasy gizlenendir, şonuň netijesinde Java ulanyp operasiýa ulgamynyň adyny kesgitlemegi öwrenersiňiz we netijä baglylykda bir ýa-da başga bir işi ýerine ýetirersiňiz.
Bu nagşa doly düşünmek üçin aşakdaky mowzuklara gowy düşünmeli:
  • Java-da miras;
  • Java-da abstrakt sapaklar we usullar.

Abstrakt zawod nagşy haýsy meseleleri çözýär?

Abstrakt zawod, ähli zawod nagyşlary ýaly, täze obýektleriň döredilmegini dogry guramaga kömek edýär. Onuň kömegi bilen, dürli baglanyşykly zatlaryň dürli maşgalalarynyň “goýberilmegini” dolandyrýarys. Özara baglanyşykly zatlaryň dürli maşgalalary ... Näme? Alada etme: iş ýüzünde hemme zat görünýäninden has ýönekeý. Baglanyşykly zatlaryň maşgalasy bolup biljek zatlardan başlalyň? Siziň bilen strategiýa düzýäris we onda birnäçe söweş bölümi bar diýeliň:
  • pyýada goşun;
  • atly goşun;
  • ýaýçylar.
Söweş bölümleriniň bu görnüşleri biri-biri bilen baglanyşykly, sebäbi olar bir goşunda gulluk edýärler. Aboveokarda sanalan kategoriýalaryň özara baglanyşykly zatlaryň maşgalasydygyny aýdyp bileris. Bu düzüldi. Emma abstrakt zawod nagşy, biri-birine bagly zatlaryň dürli maşgalalarynyň döredilmegini guramak üçin ulanylýar . Bu ýerde-de çylşyrymly zat ýok. Mysaly strategiýa bilen dowam etdireliň. Adatça birnäçe dürli garşy taraplary bar. Dürli taraplaryň söweş bölümleri daşky görnüşi boýunça ep-esli tapawutlanyp biler. Rim goşunynyň pyýada esgerleri, atlylary we ýaýçylary Wikingleriň pyýada esgerleri, atlylary we ýaýçylary bilen birmeňzeş däl. Strategiýanyň çäginde dürli goşun esgerleri biri-birine bagly zatlaryň dürli maşgalalarydyr. Programmistiň ýalňyşlygy bilen, Napoleon döwründen bäri fransuz eşigindäki esger rim pyýada goşunynyň arasynda aýlanyp ýörse gülkünç bolardy. Şeýle meseläni çözmek üçin abstrakt zawod dizaýn nusgasy zerur. Nook, wagt syýahatyny utandyrmak meselesi däl-de, eýsem birek-birege bagly obýektleriň dürli toparlaryny döretmek. Abstrakt zawod, bar bolan önümleri (maşgala obýektleri) döretmek üçin interfeýs üpjün edýär. Abstrakt zawodda adatça birnäçe ýerine ýetiriş bolýar. Olaryň her biri üýtgeşiklikleriň biriniň önümlerini döretmek üçin jogapkärdir. Strategiýanyň bir bölegi hökmünde abstrakt pyýada goşuny, ýaýçylary we atlylary döredýän abstrakt zawod, şeýle hem bu zawodyň durmuşa geçirilmegi bolar. Rim legionerlerini döredýän zawod we, mysal üçin, Karfagen söweşijilerini döredýän zawod. Abstraksiýa bu nagşyň iň möhüm ýörelgesidir. Zawod müşderileri onuň bilen we önümler bilen diňe abstrakt interfeýsler arkaly işleýärler. Şonuň üçin häzirki wagtda haýsy söweşijileri döredýändigimiz hakda pikir etmeli däl, ýöne bu jogapkärçiligi abstrakt zawodyň belli bir ýerine ýetirilmegine geçirmeli.

Kofe dükanyny awtomatlaşdyrmagy dowam etdirýäris

Geçen leksiýada zawodyň usulyny öwrendik, onuň kömegi bilen kofe biznesini giňeldip we birnäçe täze kofe satuw nokatlaryny açyp bildik. Bu gün işimizi döwrebaplaşdyrmak boýunça işimizi dowam etdireris. Abstrakt zawod nagşyny ulanyp, onlaýn kofe sargyt etmek üçin täze iş stoly programmasynyň düýbüni tutarys. Iş stoly üçin programma ýazanymyzda, elmydama platforma hakda pikirlenmeli. Programmamyz macOS-da we Windows-da işlemeli (spoiler: Linux öý işi hökmünde size galar). Arzamyz nähili bolar? Örän ýönekeý: bu tekst meýdanyndan, saýlanan meýdançadan we düwmeden ybarat bir görnüş bolar. Dürli operasiýa ulgamlaryny ulanmak tejribäňiz bar bolsa, Windows-da düwmeleriň “Mac” -a garanyňda başgaça görkezilýändigini gördüňiz. Elsehli zat ýaly ... Şeýdip, başlalyň. Önüm maşgalalarynyň rolunda, öňem düşünşiňiz ýaly, grafiki interfeýs elementleri bolar:
  • düwmeler;
  • tekst meýdanlary;
  • saýlamak üçin meýdanlar.
Düşündiriş. Her interfeýsiň içinde ýa-da onClickýaly usullary kesgitläp bilerdik . Bular. dürli hadysalary çözmäge mümkinçilik berýän usullar (düwmä basmak, tekst girizmek, saýlanan gutuda baha saýlamak). Bularyň hemmesi mysaly artykmaç ýüklemezlik we zawodyň görnüşini öwrenmek üçin has görnükli etmek üçin bilgeşleýin aýrylýar. Önümlerimiz üçin abstrakt interfeýsleri kesgitläliň: onValueChangedonInputChanged
public interface Button {}
public interface Select {}
public interface TextField {}
Her bir operasiýa ulgamy üçin şol operasiýa ulgamynyň stilinde interfeýs elementlerini döretmeli. Windows we MacOS üçin ýazýarys. Windows üçin amallary döredeliň:
public class WindowsButton implements Button {
}

public class WindowsSelect implements Select {
}

public class WindowsTextField implements TextField {
}
Indi MacOS-da edil şonuň ýaly:
public class MacButton implements Button {
}

public class MacSelect implements Select {
}

public class MacTextField implements TextField {
}
Gowy. Indi bar bolan abstrakt önüm görnüşlerini döredýän abstrakt zawodymyza başlap bileris:
public interface GUIFactory {

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

}
Kämil. Görşüňiz ýaly, şu wagta çenli çylşyrymly zat ýok. Soň hemme zat edil ýönekeý. Önümler bilen meňzeşlik bilen, her OS üçin zawodymyzyň dürli amallaryny döredýäris. Windows bilen başlalyň:
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();
    }
}
Işleýşini hasam görkezmek üçin içindäki usullar we konstruktorlar içindäki konsol çykyşy goşuldy. Indi macOS üçin:
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();
    }
}
Bellik: her usul, goluna görä abstrakt görnüşi görkezýär. Emma usulyň içinde önümiň anyk ýerine ýetirilişini döredýäris. Bu, aýratyn mysallaryň döredilmegine gözegçilik edýän ýeke-täk ýerimizdir. Indi forma synpyny ýazmagyň wagty geldi. Bu Java synpy, meýdanlary interfeýs elementleri:
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();
    }
}
Abstrakt zawod, interfeýs elementlerini döredýän forma konstruktoryna geçirilýär. Belli bir OS üçin interfeýs elementlerini döredip biler ýaly, zerur zawod ýerine ýetirijisini konstruktora geçireris.
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();
    }
}
Programmany Windows-da işlesek, aşakdaky netijäni alarys:

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
“Mac” -da çykyş aşakdaky ýaly bolar:

Creating gui factory for macOS
Creating order coffee form
Creating TextField for macOS
Creating Select for macOS
Creating Button for macOS
Linux-da:

Unknown OS, can't draw form :( 
Garaz, siz we men aşakdaky netijä gelýäris. Belli bir OS üçin laýyk gelýän interfeýs elementlerini döredýän GUI programmasy üçin çarçuwa ýazdyk. Döreden zatlarymyzy gysgaça gaýtalalyň:
  • Önüm maşgalasy: giriş meýdançasy, saýlama meýdançasy we düwme.
  • Windows we macOS üçin önümler maşgalasynyň dürli durmuşa geçirilmegi.
  • Abstrakt zawod, önümlerimizi döretmek üçin interfeýsi kesgitledik.
  • Zawodymyzyň her biri, önümleriň belli bir maşgalasyny döretmek üçin jogapkärdir.
  • Forma, Java synpy, meýdanlary abstrakt zawod ulanyp, zerur bahalar bilen konstruktorda başlanan abstrakt interfeýs elementleri.
  • Programma synpy. Içinde zawodymyzyň zerur ýerine ýetirilişini konstruktora geçirýän bir görnüş döredýäris.
Jemi: abstrakt zawod görnüşini durmuşa geçirdik.

Abstrakt zawod: ulanmak üçin görkezmeler

Abstrakt zawod, belli bir önüm synplaryna bagly bolmazdan, dürli önüm maşgalalarynyň döredilmegini dolandyrmak üçin dizaýn nusgasydyr. Bu şablony ulananyňyzda:
  1. Önüm maşgalalarynyň özlerini kesgitläň. Olardan ikimiziň bardygyny çaklalyň:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. Maşgaladaky her önüm üçin abstrakt synpy (interfeýs) kesgitläň. Biziň ýagdaýymyzda:
    • ProductA
    • ProductB
  3. Her önüm maşgalasynyň içinde her önüm 2-nji ädimde kesgitlenen interfeýsi durmuşa geçirmeli.
  4. 2-nji ädimde kesgitlenen her önüm üçin usullary döretmek bilen abstrakt zawod dörediň. Biziň ýagdaýymyzda bu usullar:
    • ProductA createProductA();
    • ProductB createProductB();
  5. Abstrakt zawodyň ýerine ýetirişlerini dörediň, her ýerine ýetiriş bir maşgalanyň önümleriniň döredilmegine gözegçilik eder. Munuň üçin abstrakt zawodyň her bir ýerine ýetirilişiniň içinde önümleriň anyk ýerine ýetirilmegi döredilip, içerde yzyna gaýtarylmagy üçin ähli döredilen usullary durmuşa geçirmeli.
Aşakda ýokarda görkezilen görkezmeleri görkezýän UML diagrammasy bar: Dizaýn nagyşlary: Abstrakt zawod - 3Indi bu görkezmäniň koduny ýazalyň:
// Определим общие интерфейсы продуктов
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();
    }
}

Öý işi

Materiallary birleşdirmek üçin 2 zady edip bilersiňiz:
  1. Kofe sargyt programmasyny Linux-da işlemegi üçin gowulandyryň.
  2. Islendik strategiýanyň birliklerini öndürmek üçin öz abstrakt zawodyňyzy dörediň. Bu hakyky goşunlar bilen taryhy strategiýa ýa-da orklar, derwüşler we elfler bilen fantaziýa bolup biler. Esasy zat, ony gyzykly görmekdir. Döredijilikli boluň, konsola gysgyç ýazyň we nagyşlary öwrenip hezil ediň!
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION