JavaRush /Java Blog /Random-TK /Zawodyň dizaýny

Zawodyň dizaýny

Toparda çap edildi
Salam, dost! Bu gün siziň bilen dizaýn nagyşlaryny öwrenmegi dowam etdireris. Bu leksiýada zawod hakda gürleşeris. Bu şablony ulanmak bilen haýsy meseläniň çözüljekdigini ara alyp maslahatlaşarys we zawodyň kofe dükanyny açmagyna nähili kömek edýändigine serederis. Zawod döretmek üçin size 5 sany ýönekeý ädim hem bererin. Zawod dizaýn nusgasy - 1Hemmeler bilen bir sahypada bolmak we manysyna aňsatlyk bilen düşünmek üçin aşakdaky temalar bilen tanyş bolmaly:
  • Java-da miras
  • Java-da salgylanma görnüşlerini daraltmak we giňeltmek
  • Dürli synplaryň we obýektleriň özara täsiri

Zawod näme?

Zawodyň dizaýn nagşy, obýektleriň döredilmegine gözegçilik etmäge mümkinçilik berýär. Täze obýekt döretmek prosesi beýle bir ýönekeý däl, ýöne gaty çylşyrymly däl. Täze bir obýekt döretmek üçin ulanmalydygymyzy hemmämiz bilýäris new. Bu ýerde dolandyryp boljak zat ýok ýaly bolup görünýär, ýöne beýle däl. Programmamyzda köp nesli bolan belli bir synp bar bolsa, käbir şertlere baglylykda belli bir synpyň mysalyny döretmeli bolanda kynçylyklar ýüze çykyp biler. Zawod , käbir şertlere baglylykda dürli obýektleri döretmek meselesini çözmäge kömek edýän dizaýn nagşydyr. Abstrakt, şeýlemi? Aşakdaky mysala seredenimizde has anyklyk we aýdyňlyk peýda bolar.

Dürli kofe döredýäris

Kofe dükanyny awtomatlaşdyrmak isleýäris diýeliň. Dürli kofe taýýarlamagy öwrenmeli. Munuň üçin programmamyzda kofe synpyny we olardan emele gelenleri dörederis: Amerikanano, kapuçino, espresso, latte - taýýarlan kofeniň görnüşleri. Umumy kofe synpyndan başlalyň:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
Geliň, mirasçylaryny döredeliň:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Müşderilerimiz kofe görnüşine sargyt ederler we bu maglumatlary programma geçirmeli. Bu dürli usullar bilen, mysal üçin ulanmak arkaly edilip bilner String. Emma bu maksatlar üçin iň amatlysydyr enum. Geliň, enumonda sargytlary kabul edýän kofe görnüşlerini döredeliň we kesgitläliň:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Gowy, indi kofe dükanymyz üçin kod ýazalyň:
public class CoffeeShop {

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucсino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Вот ваш кофе! Спасибо, приходите еще!");
        return coffee;
    }
}
Usuly orderCoffeeiki bölege bölmek bolar:
  1. Bir blokda belli bir kofe mysalyny döretmek switch-case. Zawodyň edýän ýeri, şertlere baglylykda belli bir görnüşi döretmekdir.
  2. Taýýarlygyň özi üwürmek, bişirmek we bir käse guýmak.
Geljekde usula üýtgetmeler girizmelidigiňizi bilmek möhüm zat:
  1. Taýýarlyk algoritminiň özi (üwemek, bişirmek we bir käse guýmak) üýtgemez (iň bolmanda şeýle bolar diýip umyt edýäris).
  2. Emma kofeniň görnüşi üýtgäp biler. Belki, moça ýasap başlarys .. Moça .. Mokkaçi ... Hudaý ýalkasyn, täze kofe.
Geljekde belli bir ähtimallyk derejesi bilen usula, bloklara üýtgetmeler girizmelidigimizi eýýäm çaklap bileris switch-case. Şeýle hem, kofe dükanymyzda bu usulyň orderCoffeedürli görnüşli kofe döredýän ýeke-täk ýerimiz bolmazlygy mümkindir. Şonuň üçin birnäçe ýerde üýtgeşmeler girizilmeli. Meniň näme alýandygyma eýýäm düşünersiňiz. Reaktor etmeli. Kofe döretmek üçin jogapkär bloky iki sebäbe görä aýratyn klasa geçiriň:
  1. Başga ýerlerde kofe döretmek logikasyny gaýtadan ulanyp bileris.
  2. Aralyk üýtgese, kofe döretmek üçin ulanylýan hemme ýerde kod redaktirlemeli bolmaz. Kody diňe bir ýerde üýtgetmek ýeterlik bolar.
Başgaça aýdylanda, zawody kesmegiň wagty geldi.

Ilkinji zawodymyzy görýäris

Munuň üçin diňe kofe sapaklarynyň zerur mysallaryny döretmek üçin jogapkär boljak täze synp döredeliň:
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 Cappucino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        return coffee;
    }
}
Gutlaýarys! Zawodyň dizaýn nusgasyny iň ýönekeý görnüşinde durmuşa geçirdik. Usul statik edilse hemme zat has ýönekeý bolup bilerdi createCoffee. Emma soň iki mümkinçiligi ýitireris:
  1. Ondan miras alyň SimpleCoffeeFactorywe ýok ediň createCoffee.
  2. Zawodyň zerur ýerine ýetirilişini synplarymyzda ýerine ýetiriň.
Implementationerine ýetirilişi barada. Kofe dükanyna gaýdyp, kofe öndürýän zawodymyzy durmuşa geçirmeli.

Zawodyň kofe dükanyna ornaşdyrylmagy

Zawod ulanyp, kofe dükanymyzyň synpyny täzeden ýazalyň:
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;
    }
}
Gowy. Indi Zawodyň dizaýn nagşynyň gurluşyny shematiki we gysgaça suratlandyrmaga synanyşalyň.

Zawodyňyzy açmak üçin 5 ädim

Stepdim 1. Programmaňyzda aşakdaky suratdaky ýaly birnäçe nesil bilen synpyňyz bar: 2-nji ädim . Her nesil synpy üçin san üýtgeýänini kesgitleýän Zawodyň dizaýn nusgasy - 2synp döredýärsiňiz :enum
enum CatType {
    LION,
    TIGER,
    BARSIK
}
Stepdim 3. Zawodyňyzy gurýarsyňyz. Oňa jaň edýärsiňiz MyClassFactory, kod aşakda:
class CatFactory {}
Stepdim 4. Zawodyňyzda createMyClassüýtgeýjini alýan usul döredýärsiňiz - enum MyClassType. Aşakdaky kod:
class CatFactory {
    public Cat createCat(CatType type) {

    }
}
5-nji ädim. Enhli bahalary gaýtalap, bahanyň switch-casegabat gelýän synpyny döredýän usulyň mazmunyna bir blok ýazýarsyňyz :enum
class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;

            switch (type) {
                case LION:
                    cat =  new Barsik();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case BARSIK:
                    cat =  new Lion();
                    break;
            }

            return cat;
        }
    }
Başlyk ýaly.

Nädip türgenleşmeli

Okamak gowy, kod ýazmak hasam gowy. Adyňyzda hatda birnäçe harp bar bolsa, öz wirtual pizzeriýaňyzy döretmäge synanyşyň. Adyňyzda geň mukdarda harp bar bolsa, wirtual suşi çyzgysyny döretmäge synanyşyň. Anonim bolsaňyz, bagtlysyňyz. Bu gün dynç alyp bilersiňiz.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION