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

Pola Desain: FactoryMethod

Diterbitake ing grup
Hello! Dina iki kita bakal terus sinau pola desain lan ngomong babagan metode pabrik (FactoryMethod). Pola Desain: FactoryMethod - 1Sampeyan bakal ngerti apa iku lan apa tugas cithakan iki cocok kanggo. Kita bakal nliti pola desain iki ing praktik lan njelajah strukture. Kanggo nggawe kabeh ing ndhuwur cetha kanggo sampeyan, sampeyan kudu ngerti topik ing ngisor iki:
  1. Pusaka ing Jawa.
  2. Metode lan kelas abstrak ing basa Jawa.

Apa masalah cara pabrik ngatasi?

Ing kabeh pola desain pabrik, ana rong klompok peserta - pencipta (pabrik dhewe) lan produk (obyek sing digawe pabrik). Bayangake kahanan: kita duwe pabrik sing ngasilake mobil miturut merek AutoRush. Dheweke ngerti carane nggawe model mobil kanthi macem-macem jinis awak:
  • sedan
  • gerbong stasiun
  • coupe
Prekara-prekara sing apik banget kanggo kita, nganti ing sawijining dina kita nyerep keprihatinan OneAuto. Minangka manajer sing wicaksana, kita ora pengin kelangan pelanggan OneAuto, lan tugas kita yaiku nyusun ulang produksi kanthi cara sing bisa ngasilake:
  • Sedan AutoRush Kab
  • AutoRush station wagon
  • coupe AutoRush
  • sedan OneAuto
  • OneAuto station wagon
  • coupe OneAuto
Kaya sing sampeyan ngerteni, tinimbang siji klompok produk turunan, muncul loro, sing beda-beda ing sawetara rincian. Pola desain metode pabrik ngatasi masalah nggawe klompok produk sing beda-beda, saben kanthi spesifik. Kita bakal nimbang prinsip cithakan iki ing laku, mboko sithik obah saka prasaja kanggo Komplek, nggunakake conto warung kopi kita, kang digawe ing salah siji saka ceramah sadurungé .

A sethitik babagan cithakan pabrik

Ayo kula ngelingake sampeyan: kita mbangun warung kopi virtual cilik karo sampeyan. Ing kono, kita sinau carane nggawe macem-macem jinis kopi nggunakake pabrik sing prasaja. Dina iki kita bakal nyaring conto iki. Ayo padha elinga kaya apa warung kopi kita kanthi pabrik sing prasaja. Kita duwe kelas kopi:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
Lan uga sawetara ahli waris - jinis kopi tartamtu sing bisa diprodhuksi pabrik kita:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Kanggo penak nampa pesenan, kita wis ngenalake transfer:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Pabrik kopi dhewe katon kaya mangkene:
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;
    }
}
Lan pungkasane, warung kopi dhewe:
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;
    }
}

Modernisasi pabrik prasaja

Warung kopi kita apik. Dadi akeh supaya kita mikir babagan ngembangake. Kita pengin mbukak sawetara titik anyar. Minangka wong sing enterprising, kita ora bakal nggawe warung kopi monoton. Aku pengin saben wong duwe twist dhewe. Mulane, kanggo miwiti, kita bakal mbukak rong titik: ing gaya Italia lan Amerika. Owah-owahan bakal mengaruhi ora mung interior, nanging uga ombenan:
  • ing warung kopi Italia, kita bakal nggunakake merek kopi khusus Italia, kanthi grinding lan roasting khusus.
  • Bagian Amerika bakal dadi luwih gedhe, lan saben pesenan kita bakal ngawula marshmallow sing ilang - marshmallow.
Siji-sijine sing bakal tetep ora owah yaiku model bisnis kita, sing wis kabukten kanthi apik. Yen kita ngomong nganggo basa kode, iki kedadeyan. Kita duwe 4 kelas produk:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Lan dadi 8:
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 {}
Amarga kita pengin supaya model bisnis saiki ora diganti, kita pengin cara orderCoffee(CoffeeType type)ngalami owah-owahan minimal. Ayo dideleng:
public Coffee orderCoffee(CoffeeType type) {
    Coffee coffee = coffeeFactory.createCoffee(type);
    coffee.grindCoffee();
    coffee.makeCoffee();
    coffee.pourIntoCup();

    System.out.println("Вот ваш кофе! Спасибо, приходите еще!");
    return coffee;
}
Apa pilihan sing kita duwe? Kita wis ngerti carane nulis pabrik, ta? Wangsulan: Bab ingkang paling prasaja sing langsung teka ing atine kanggo nulis loro pabrik padha, lan banjur pass implementasine dibutuhake kanggo warung kopi kita ing konstruktor. Banjur kelas warung kopi ora owah. Kaping pisanan, kita kudu nggawe kelas pabrik anyar, entuk warisan saka pabrik sing prasaja lan ngilangi createCoffee (CoffeeType type). Ayo nulis pabrik kanggo nggawe kopi ing gaya Italia lan Amerika:
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;
    }

}
Saiki kita bisa ngirim implementasi pabrik sing dibutuhake menyang CoffeeShop. Ayo ndeleng kaya apa kode pesenan kopi saka macem-macem warung kopi. Contone, cappuccino ing gaya Italia lan Amerika:
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);
    }
}
Kita nggawe rong toko kopi sing beda-beda, nransfer saben menyang pabrik sing dibutuhake. Ing tangan siji, kita wis entuk gol kita, nanging ing sisih liya ... Ana sing ngeruk jiwa pengusaha sing ora bisa ditahan ... Ayo ngerteni apa sing salah. Kaping pisanan, akeh pabrik. Apa bisa nggawe pabrik dhewe saben wektu kanggo titik anyar lan, saliyane, priksa manawa nalika nggawe warung kopi, pabrik sing dibutuhake ditransfer menyang konstruktor? Kapindho, isih pabrik sing prasaja. Mung rada modern. Kita isih sinau pola anyar ing kene. Katelu, apa ora bisa ditindakake kanthi cara sing beda? Iku bakal kelangan yen kita bisa localize kabeh pitakonan babagan nggawe kopi nang kelas CoffeeShop, ngubungake proses nggawe kopi lan servicing pesenan, nanging ing wektu sing padha njaga cukup keluwesan kanggo nggawe kopi ing macem-macem gaya. Jawabane ya, sampeyan bisa. Iki diarani pola desain metode pabrik.

Saka pabrik sing prasaja nganti cara pabrik

Kanggo ngatasi masalah kanthi efisien, kita:
  1. Ayo bali metode createCoffee(CoffeeType type)menyang kelas CoffeeShop.
  2. Ayo nggawe cara iki abstrak.
  3. Kelas dhewe CoffeeShopbakal dadi abstrak.
  4. Kelas CoffeeShopbakal duwe ahli waris.
Ya, kanca. Warung kopi Italia ora luwih saka pewaris kelas CoffeeShop, ngetrapake metode createCoffee(CoffeeType type)sing cocog karo tradhisi barista Italia sing paling apik. Dadi, supaya. Langkah 1. Ayo nggawe kelas Coffeeabstrak. Saiki kita duwe rong kulawarga produk sing beda. Ombenan kopi Italia lan Amerika isih nuduhake leluhur sing padha: ing Coffee. Iku bakal bener kanggo nggawe abstrak:
public abstract class Coffee {
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
Langkah 2. Nggawe CoffeeShopabstrak, kanthi metode abstrakcreateCoffee(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);
}
Langkah 3. Nggawe warung kopi Italia, kelas turunan saka warung kopi abstrak. Ing kana kita ngetrapake metode kasebut createCoffee(CoffeeType type)kanthi nganggep spesifik Italia.
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;
    }
}
Langkah 4. Ayo padha kanggo warung kopi gaya Amerika.
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;
    }
}
Langkah 5. Ayo dipikirake kaya apa pesen latte gaya Amerika lan Italia:
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);
    }
}
Sugeng. Kita mung ngetrapake pola desain metode pabrik ing warung kopi.

Cara kerjane cara pabrik

Saiki ayo dideleng kanthi luwih cetha babagan apa sing diduweni. Diagram ing ngisor iki nuduhake kelas asil. Blok ijo minangka kelas pencipta, blok biru minangka kelas produk. Pola Desain: FactoryMethod - 2Apa kesimpulan sing bisa ditindakake?
  1. Kabeh produk minangka implementasi saka kelas abstrak Coffee.
  2. Kabeh pangripta minangka implementasi saka kelas abstrak CoffeeShop.
  3. Kita mirsani rong hierarki kelas paralel:
    • Hierarki produk. Kita ndeleng keturunan Italia lan keturunan Amerika
    • Hierarki pangripta. Kita ndeleng keturunan Italia lan keturunan Amerika
  4. Superclass CoffeeShopora duwe informasi babagan implementasi produk tartamtu ( Coffee) sing bakal digawe.
  5. Superclass CoffeeShoputusan nggawe produk tartamtu kanggo turunane.
  6. Saben kelas turunan CoffeeShopngleksanakake cara pabrik createCoffee()sesuai karo spesifike. Ing tembung liyane, ing implementasine kelas pencipta, keputusan digawe kanggo nyiapake produk tartamtu adhedhasar spesifik kelas pencipta.
Saiki sampeyan wis siyap kanggo nemtokake pola cara pabrik . Pola cara pabrik nemtokake antarmuka kanggo nggawe obyek, nanging ngidini subclasses milih kelas saka conto kanggo nggawe. Mangkono, metode Pabrik delegasi operasi instantiasi menyang subkelas. Umumé, ngelingi definisi ora penting kaya ngerti cara kerjane.

Struktur metode pabrik

Pola Desain: FactoryMethod - 3Diagram ing ndhuwur nuduhake struktur umum pola metode pabrik. Apa maneh sing penting ing kene?
  1. Kelas Creator ngemot implementasi kabeh metode sing sesambungan karo produk, kajaba metode pabrik.
  2. Cara abstrak factoryMethod()kudu ditindakake dening kabeh turunan kelas Creator.
  3. Kelas kasebut ConcreteCreatorngetrapake metode factoryMethod()sing langsung ngasilake produk.
  4. Kelas iki tanggung jawab kanggo nggawe produk tartamtu. Iki minangka siji-sijine kelas kanthi informasi babagan nggawe produk kasebut.
  5. Kabeh produk kudu ngetrapake antarmuka umum - dadi turunan saka kelas produk umum. Iki perlu supaya kelas sing nggunakake produk bisa digunakake ing tingkat abstraksi tinimbang implementasi konkrit.

Peer

Dadi, dina iki kita nindakake cukup akeh karya lan sinau pola desain metode pabrik. Iku wektu kanggo nggabungake materi sing wis dijamin! Tugas 1. Garap buka warung liyane. Bisa digawe ing gaya Inggris utawa Spanyol. Utawa malah ing gaya spaceship. Ayo ditambahake pewarna pangan ing kopi supaya bisa sumunar, lan umume, kopi mung dadi papan! Tugas 2. Ing kuliah pungkasan, sampeyan duwe tugas nggawe bar sushi virtual utawa pizzeria virtual. Tugas sampeyan ora mandheg. Dina iki sampeyan sinau carane nggunakake pola cara pabrik kanggo entuk sukses. Iku wektu kanggo njupuk kauntungan saka kawruh iki lan nggedhekake bisnis dhewe;)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION