JavaRush /Java Blog /Random-TK /Dizaýn nagyşlary: Zawod usuly

Dizaýn nagyşlary: Zawod usuly

Toparda çap edildi
Salam! Bu gün dizaýn nagyşlaryny öwrenmäge we zawod usuly (FactoryMethod) hakda gürleşmäge dowam ederis. Dizaýn nagyşlary: Zawod usuly - 1Munuň nämedigini we bu şablonyň haýsy wezipelere laýykdygyny öwrenersiňiz. Bu dizaýn nusgasyna iş ýüzünde serederis we gurluşyny öwreneris. Aboveokardakylaryň hemmesini size düşnükli etmek üçin aşakdaky mowzuklara düşünmeli:
  1. Java-da miras.
  2. Java-da abstrakt usullar we sapaklar.

Zawod usuly haýsy meseläni çözýär?

Zawodyň dizaýn nusgalarynyň hemmesinde gatnaşyjylaryň iki topary bar - döredijiler (zawodlaryň özi) we önümler (zawodlar tarapyndan döredilen zatlar). Theagdaýy göz öňüne getiriň: “AutoRush” markasy bilen awtoulag öndürýän zawodymyz bar. Dürli görnüşli awtoulag modellerini nädip döretmelidigini bilýär:
  • sedanlar
  • wagon wagonlary
  • kupe
Usagdaýlar biziň üçin şeýle gowy gidýärdi welin, bir gowy gün OneAuto aladasyny kabul etdik. Düşünjeli dolandyryjylar hökmünde OneAuto müşderilerini ýitirmek islemeýäris we biziň wezipämiz önümçiligi öndürip boljak görnüşde üýtgedip gurmak:
  • “AutoRush” sedanlary
  • “AutoRush” wagon wagonlary
  • kupe AutoRush
  • OneAuto sedanlary
  • OneAuto wagon wagonlary
  • OneAuto kupe
Görşüňiz ýaly, emele gelen önümleriň bir toparynyň ýerine käbir jikme-jiklikler bilen tapawutlanýan ikisi peýda boldy. Zawod usuly dizaýn nagşy, hersiniň aýratynlygy bolan dürli önüm toparlaryny döretmek meselesini çözýär. Bu şablonyň ýörelgesini iş ýüzünde öwreneris, öňki leksiýalaryň birinde döreden kofe dükanymyzyň mysalyny ulanyp, ýuwaş-ýuwaşdan çylşyrymlylyga geçeris .

Zawodyň şablony barada azajyk

Youatladýaryn: siziň bilen kiçijik wirtual kofe dükany gurduk. Onda ýönekeý zawodyň kömegi bilen dürli görnüşli kofe döretmegi öwrendik. Bu gün bu mysaly has-da kämilleşdireris. Simpleönekeý zawodly kofe dükanymyzyň nähili bolandygyny ýada salalyň. Kofe synpymyz bardy:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
Şeýle hem, mirasdüşerleriniň birnäçesi - zawodymyzyň öndürip biljek kofe görnüşleri:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Sargytlary kabul etmegiň amatlylygy üçin geçirimleri hödürledik:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Kofe fabriginiň özi şeýle görünýärdi:
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 Cappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        return coffee;
    }
}
Netijede, kofe dükanynyň özi:
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;
    }
}

Simpleönekeý zawodyň döwrebaplaşdyrylmagy

Kofe dükanymyz gowy işleýär. Gaty giňeltmek hakda pikir edýäris. Birnäçe täze nokady açmak isleýäris. Öwreniji ýigitler hökmünde monoton kofe dükanlaryny kowmarys. Her kimiň öz öwrüminiň bolmagyny isleýärin. Şonuň üçin başlamak üçin iki nokady açarys: italýan we amerikan stillerinde. Üýtgeşmeler diňe bir içki otaga däl, eýsem içgilere-de täsir eder:
  • italýan kofe dükanynda ýörite üwemek we gowurmak bilen diňe italýan kofe markalaryny ulanarys.
  • Amerikan bölegi birneme ulurak bolar we her sargyt bilen eredilen batgalyklara - batgalyklara hyzmat ederis.
Üýtgemän galan ýekeje zat, özüni gowy görkezen iş modelimizdir. Kod dilinde gürlesek, şeýle bolýar. Önümleriň 4 synpy bardy:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
8 bolýar:
public class ItalianStyleAmericano extends Coffee {}
public class ItalianStyleCappucino extends Coffee {}
public class ItalianStyleCaffeLatte extends Coffee {}
public class ItalianStyleEspresso extends Coffee {}

public class AmericanStyleAmericano extends Coffee {}
public class AmericanStyleCappucino extends Coffee {}
public class AmericanStyleCaffeLatte extends Coffee {}
public class AmericanStyleEspresso extends Coffee {}
Häzirki işewürlik modelini üýtgetmezlik isleýänimiz üçin, usulyň orderCoffee(CoffeeType type)iň az mukdarda üýtgeşme bolmagyny isleýäris. Geliň, oňa göz aýlalyň:
public Coffee orderCoffee(CoffeeType type) {
    Coffee coffee = coffeeFactory.createCoffee(type);
    coffee.grindCoffee();
    coffee.makeCoffee();
    coffee.pourIntoCup();

    System.out.println("Вот ваш кофе! Спасибо, приходите еще!");
    return coffee;
}
Bizde haýsy mümkinçilikler bar? Zawod ýazmagy eýýäm bilýäris, şeýlemi? Derrew kellä gelýän iň ýönekeý zat, şuňa meňzeş iki zawod ýazmak we zerur ýerine ýetirişi konstruktordaky kofe dükanymyza geçirmek. Şonda kofe dükanynyň synpy üýtgemez. Ilki bilen, täze zawod synpyny döretmeli, ýönekeý zawodymyzdan miras almaly we ýok etmeli createCoffee (CoffeeType type). Italýan we Amerikan stillerinde kofe döretmek üçin zawodlar ýazalyň:
public class SimpleItalianCoffeeFactory extends SimpleCoffeeFactory {

    @Override
    public Coffee createCoffee (CoffeeType type) {
        Coffee coffee = null;
        switch (type) {
            case AMERICANO:
                coffee = new ItalianStyleAmericano();
                break;
            case ESPRESSO:
                coffee = new ItalianStyleEspresso();
                break;
            case CAPPUCCINO:
                coffee = new ItalianStyleCappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new ItalianStyleCaffeLatte();
                break;
        }
        return coffee;
    }
}

public class SimpleAmericanCoffeeFactory extends SimpleCoffeeFactory{

    @Override
    public Coffee createCoffee (CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new AmericanStyleAmericano();
                break;
            case ESPRESSO:
                coffee = new AmericanStyleEspresso();
                break;
            case CAPPUCCINO:
                coffee = new AmericanStyleCappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new AmericanStyleCaffeLatte();
                break;
        }

        return coffee;
    }

}
Indi zerur zawodyň ýerine ýetirilişini CoffeeShop-a geçirip bileris. Dürli kofe dükanlaryndan kofe sargyt etmegiň kodunyň nähili boljakdygyny göreliň. Mysal üçin, italýan we amerikan stilindäki kapuçino:
public class Main {
    public static void main(String[] args) {
        /*
            Закажем капучино в итальянском стиле:
            1. Создадим фабрику для приготовления итальянского кофе
            2. Создадим новую кофейню, передав ей в конструкторе фабрику итальянского кофе
            3. Закажем наш кофе
         */
        SimpleItalianCoffeeFactory italianCoffeeFactory = new SimpleItalianCoffeeFactory();
        CoffeeShop italianCoffeeShop = new CoffeeShop(italianCoffeeFactory);
        italianCoffeeShop.orderCoffee(CoffeeType.CAPPUCCINO);


         /*
            Закажем капучино в американском стиле
            1. Создадим фабрику для приготовления американского кофе
            2. Создадим новую кофейню, передав ей в конструкторе фабрику американского кофе
            3. Закажем наш кофе
         */
        SimpleAmericanCoffeeFactory americanCoffeeFactory = new SimpleAmericanCoffeeFactory();
        CoffeeShop americanCoffeeShop = new CoffeeShop(americanCoffeeFactory);
        americanCoffeeShop.orderCoffee(CoffeeType.CAPPUCCINO);
    }
}
Her birini zerur zawoda geçirip, iki dürli kofe dükany döretdik. Bir tarapdan maksadymyza ýetdik, beýleki tarapdan ... Bir zat telekeçiniň gaýtaryp bolmajak ruhuny sypyrýar ... Geliň nämäniň nämedigini anyklalyň. Birinjiden, zawodlaryň bollygy. Her gezek täze bir nokat üçin öz zawodyňyzy döredip, üstesine-de, kofe dükany döredilende zerur zawodyň konstruktora geçiriljekdigine göz ýetirip bilersiňizmi? Ikinjiden, henizem ýönekeý zawod. Biraz döwrebaplaşdyryldy. Biz henizem bu ýerde täze bir nagşy öwrenýäris. Üçünjiden, muny başgaça etmek mümkin dälmi? CoffeeShopSynpyň içinde kofe ýasamak , kofe döretmek we sargyt hyzmatlaryny baglanyşdyrmak, ýöne şol bir wagtyň özünde dürli stilde kofe ýasamak üçin ýeterlik çeýeligi saklamak bilen baglanyşykly ähli soraglary ýerleşdirip bilsek gowy bolardy . Jogap hawa, edip bilersiňiz. Zawod usuly dizaýn nagşy diýilýär.

Simpleönekeý zawoddan zawod usulyna çenli

Meseläni mümkin boldugyça netijeli çözmek üçin biz:
  1. createCoffee(CoffeeType type)Usuly synpa gaýdyp bereliň CoffeeShop.
  2. Geliň, bu usuly abstrakt edeliň.
  3. Synpyň özi CoffeeShopabstrakt bolar.
  4. Synpda CoffeeShopmirasdarlar bolar.
Hawa, dost. Italiýaly kofe dükany , italýan baristalarynyň iň gowy däplerine laýyklykda CoffeeShopusuly durmuşa geçirip, synpyň mirasdüşerinden başga zat däl . createCoffee(CoffeeType type)Şeýlelik bilen. Stepdim 1. Geliň, synpy Coffeeabstrakt edeliň. Indi dürli önümlerden ybarat iki maşgalamyz bar. Italýan we Amerikan kofe içgileri henizem umumy ata-babany paýlaşýarlar : Coffee. Abstrakt etmek dogry bolar:
public abstract class Coffee {
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
CoffeeShopStepdim 2. Abstrakt usul bilen abstrakt ediňcreateCoffee(CoffeeType type)
public abstract class CoffeeShop {

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

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

        System.out.println("Вот ваш кофе! Спасибо, приходите еще!");
        return coffee;
    }

    protected abstract Coffee createCoffee(CoffeeType type);
}
Stepdim 3. Abstrakt kofe dükanynyň nesli bolan italýan kofe dükanyny dörediň. Onda createCoffee(CoffeeType type)italýan aýratynlyklaryny göz öňünde tutup usuly durmuşa geçirýäris.
public class ItalianCoffeeShop extends CoffeeShop {

    @Override
    public Coffee createCoffee (CoffeeType type) {
        Coffee coffee = null;
        switch (type) {
            case AMERICANO:
                coffee = new ItalianStyleAmericano();
                break;
            case ESPRESSO:
                coffee = new ItalianStyleEspresso();
                break;
            case CAPPUCCINO:
                coffee = new ItalianStyleCappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new ItalianStyleCaffeLatte();
                break;
        }
        return coffee;
    }
}
Stepdim 4. Geliň, Amerikan görnüşindäki kofe dükany üçin hem edil şonuň ýaly edeliň.
public class AmericanCoffeeShop extends CoffeeShop {
    @Override
    public Coffee createCoffee (CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new AmericanStyleAmericano();
                break;
            case ESPRESSO:
                coffee = new AmericanStyleEspresso();
                break;
            case CAPPUCCINO:
                coffee = new AmericanStyleCappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new AmericanStyleCaffeLatte();
                break;
        }

        return coffee;
    }
}
5-nji ädim. Geliň, Amerikan we Italiýa stilindäki latte zakaz etmegiň nähili boljakdygyna göz aýlalyň:
public class Main {
    public static void main(String[] args) {
        CoffeeShop italianCoffeeShop = new ItalianCoffeeShop();
        italianCoffeeShop.orderCoffee(CoffeeType.CAFFE_LATTE);

        CoffeeShop americanCoffeeShop = new AmericanCoffeeShop();
        americanCoffeeShop.orderCoffee(CoffeeType.CAFFE_LATTE);
    }
}
Gutlaýarys. Zawod usuly dizaýn nusgasyny kofe dükanymyzda durmuşa geçirdik.

Zawod usuly nähili işleýär

Indi alan zatlarymyza has içgin seredeliň. Aşakdaky diagrammada alnan synplar görkezilýär. Greenaşyl bloklar dörediji synplar, gök bloklar önüm synplarydyr. Dizaýn nagyşlary: Zawod usuly - 2Haýsy netijeleri çykaryp bolar?
  1. Productshli önümler abstrakt synpyň durmuşa geçirilmegi Coffee.
  2. Creathli döredijiler abstrakt synpyň durmuşa geçirilmegi CoffeeShop.
  3. Iki sany parallel synp iýerarhiýasyna syn edýäris:
    • Önümleriň iýerarhiýasy. Italýan nesillerini we Amerikan nesillerini görýäris
    • Döredijileriň iýerarhiýasy. Italýan nesillerini we Amerikan nesillerini görýäris
  4. Superklasda CoffeeShophaýsy önümiň ýerine ýetirilişiniň ( Coffee) dörediljekdigi barada maglumat ýok.
  5. Superklass CoffeeShopbelli bir önümiň döredilmegini nesillerine tabşyrýar.
  6. Her nesil synpy aýratynlyklaryna laýyklykda CoffeeShopzawod usulyny durmuşa geçirýär . createCoffee()Başgaça aýdylanda, dörediji synplaryň durmuşa geçirilişinde dörediji synpyň aýratynlyklaryna esaslanyp belli bir önüm taýýarlamak barada karar kabul edilýär.
Indi zawod usulynyň görnüşini kesgitlemäge taýyn . Zawod usuly nagşy, obýekt döretmek üçin interfeýsi kesgitleýär, ýöne kiçi klasslara dörediljek mysal synpyny saýlamaga mümkinçilik berýär. Şeýlelik bilen, Zawod usuly dessine amallary kiçi toparlara berýär. Umuman, kesgitlemäni ýatda saklamak, zatlaryň işleýşine düşünmek ýaly möhüm däl.

Zawod usuly gurluşy

Dizaýn nagyşlary: Zawod usuly - 3Aboveokardaky diagramma zawod usulynyň umumy gurluşyny görkezýär. Bu ýerde başga näme möhüm?
  1. Creatoraradyjy synpynda, zawod usulyndan başga önümler bilen täsirleşýän ähli usullaryň ýerine ýetirilişi bar.
  2. Abstrakt usul factoryMethod()synpyň ähli nesilleri tarapyndan durmuşa geçirilmelidir Creator.
  3. Synp gönüden-göni önüm öndürýän ConcreteCreatorusuly amala aşyrýar .factoryMethod()
  4. Bu synp belli önümleri döretmek üçin jogapkärdir. Bu önümleri döretmek barada maglumatly ýeke-täk synp.
  5. Productshli önümler umumy interfeýsi durmuşa geçirmeli - umumy önüm synpynyň nesilleri bolmaly. Önümleri ulanýan synplaryň anyk ýerine ýetiriş däl-de, abstraksiýa derejesinde işlemegi üçin zerurdyr.

Öý işi

Şeýlelik bilen, bu gün gaty köp iş etdik we zawod usulynyň dizaýnyny öwrendik. Youazan materialyňyzy birleşdirmegiň wagty geldi! 1-nji wezipe. Başga bir kofe dükanynyň üstünde işlemek. Iňlis stilinde ýa-da ispan dilinde ýasap bolýar. Evena-da kosmos gämisiniň stilinde. Kofeniň şöhle saçmagy üçin iýmit reňkini goşalyň, umuman aýdanyňda, kofe boş ýer bolar! 2-nji wezipe. Iň soňky leksiýada wirtual suşi bar ýa-da wirtual pizzeria döretmek meselesi bardy. Siziň wezipäňiz durmak däl. Bu gün üstünlik gazanmak üçin zawod usuly usulyny nädip ulanyp boljakdygyny öwrendiňiz. Bu bilimlerden peýdalanmagyň we öz işiňi giňeltmegiň wagty geldi;)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION