JavaRush /Java Blogu /Random-AZ /Zavod dizayn nümunəsi

Zavod dizayn nümunəsi

Qrupda dərc edilmişdir
Salam, dost! Bu gün biz sizinlə dizayn nümunələrini öyrənməyə davam edəcəyik. Bu mühazirədə biz Fabrik haqqında danışacağıq. Bu şablondan istifadə etməklə hansı problemin həll olunduğunu sizinlə müzakirə edəcəyik və fabrikin qəhvəxana açmağa necə kömək etdiyinə dair nümunəyə baxacağıq. Mən də sizə fabrik yaratmaq üçün 5 sadə addım verəcəyəm. Zavod dizayn nümunəsi - 1Hamı ilə eyni səhifədə olmaq və mahiyyəti asanlıqla qavramaq üçün aşağıdakı mövzularla tanış olmalısınız:
  • Java-da miras
  • Java-da istinad növlərinin daralması və genişləndirilməsi
  • Müxtəlif siniflər və obyektlər arasında qarşılıqlı əlaqə

Fabrika nədir?

Zavod dizayn nümunəsi obyektlərin yaradılmasına nəzarət etməyə imkan verir. Yeni obyektin yaradılması prosesi o qədər də sadə deyil, lakin o qədər də mürəkkəb deyil. Hamımız bilirik ki, yeni bir obyekt yaratmaq üçün new. Və görünə bilər ki, burada idarə olunacaq bir şey yoxdur, amma bu belə deyil. Tətbiqimizdə çoxlu nəsli olan müəyyən bir sinif olduqda çətinliklər yarana bilər və bəzi şərtlərdən asılı olaraq müəyyən bir sinfin nümunəsini yaratmaq lazımdır. Fabrika bəzi şərtlərdən asılı olaraq müxtəlif obyektlərin yaradılması problemini həll etməyə kömək edən dizayn nümunəsidir. Abstrakt, elə deyilmi? Aşağıdakı nümunəyə baxdıqda daha konkretlik və aydınlıq görünəcək.

Fərqli qəhvə növləri yaradırıq

Tutaq ki, biz bir qəhvəxananı avtomatlaşdırmaq istəyirik. Müxtəlif növ qəhvə hazırlamağı öyrənməliyik. Bunun üçün tətbiqimizdə qəhvə sinfi və onun törəmələri yaradacağıq: Americano, kapuçino, espresso, latte - hazırlayacağımız qəhvə növləri. Ümumi qəhvə sinifindən başlayaq:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
Sonra onun varislərini yaradaq:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Müştərilərimiz bir növ qəhvə sifariş edəcəklər və bu məlumat proqrama ötürülməlidir. Bu, müxtəlif yollarla edilə bilər, məsələn, istifadə edərək String. Ancaq bu məqsədlər üçün ən uyğundur enum. enumGəlin sifariş qəbul etdiyimiz qəhvə növlərini yaradaq və müəyyən edək:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Əla, indi qəhvəxanamızın kodunu yazaq:
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;
    }
}
Metod orderCoffeeiki komponentə bölünə bilər:
  1. Blokda xüsusi qəhvə nümunəsinin yaradılması switch-case. Burada Fabrikin gördüyü iş şəraitdən asılı olaraq spesifik bir növün yaradılmasıdır.
  2. Hazırlığın özü üyüdülür, bişirilir və bir fincana tökülür.
Gələcəkdə metodda dəyişiklik etməli olduğunuzu bilmək vacibdir:
  1. Hazırlıq alqoritminin özü (üyüdülməsi, bişirilməsi və bir fincana tökülməsi) dəyişməz qalacaq (ən azı buna ümid edirik).
  2. Ancaq qəhvə çeşidi dəyişə bilər. Bəlkə moça hazırlamağa başlayaq.. Moça.. Mokkaçi... Allah rəhmət eləsin, yeni növ qəhvə.
Artıq güman edə bilərik ki, gələcəkdə müəyyən bir ehtimalla metoda, bloka dəyişiklik etməli olacağıq switch-case. O da mümkündür ki, bizim qəhvəxanamızda üsul orderCoffeemüxtəlif növ qəhvələr hazırladığımız yeganə yer olmayacaq. Ona görə də bir neçə yerdə dəyişiklik edilməli olacaq. Yəqin ki, siz mənim nəyə nail olduğumu artıq başa düşürsünüz. Biz refaktor etməliyik. Qəhvə yaratmaq üçün məsul olan bloku iki səbəbə görə ayrı bir sinifə köçürün:
  1. Biz başqa yerlərdə qəhvə yaratmaq məntiqindən yenidən istifadə edə biləcəyik.
  2. Əgər diapazon dəyişirsə, biz kofenin yaradılmasının istifadə olunacağı hər yerdə kodu redaktə etmək məcburiyyətində qalmayacağıq. Kodu yalnız bir yerdə dəyişdirmək kifayətdir.
Başqa sözlə, zavodu ixtisar etməyin vaxtıdır.

İlk fabrikimizi mişar edirik

Bunu etmək üçün, yalnız qəhvə siniflərinin lazımi nümunələrinin yaradılmasına cavabdeh olacaq yeni bir sinif yaradaq:
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;
    }
}
Təbrik edirik! Biz indicə Fabrika dizayn modelini ən sadə formada tətbiq etdik. Baxmayaraq ki, metod statik edilsəydi, hər şey daha sadə ola bilərdi createCoffee. Lakin o zaman biz iki imkanı itirmiş olarıq:
  1. -dən miras alın SimpleCoffeeFactoryvə onu ləğv edin createCoffee.
  2. Dərslərimizdə tələb olunan zavod tətbiqini həyata keçirin.
İcradan danışarkən. Qəhvəxanaya qayıtmalı və kofe hazırlama fabrikimizi həyata keçirməliyik.

Bir fabrikin qəhvəxanaya daxil edilməsi

Gəlin bir fabrikdən istifadə edərək qəhvəxana sinifimizi yenidən yazaq:
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;
    }
}
Əla. İndi Fabrika dizayn nümunəsinin strukturunu sxematik və qısa şəkildə təsvir etməyə çalışaq.

Öz fabrikinizi açmaq üçün 5 addım

Addım 1. Proqramınızda aşağıdakı şəkildə olduğu kimi bir neçə nəsli olan sinifiniz var: Addım 2. Siz hər bir nəsil sinfi üçün enum dəyişənini təyin etdiyiniz Zavod dizayn nümunəsi - 2sinif yaradırsınız :enum
enum CatType {
    LION,
    TIGER,
    BARSIK
}
Addım 3. Siz öz fabrikinizi qurursunuz. Siz onu çağırırsınız MyClassFactory, kod aşağıdadır:
class CatFactory {}
Addım 4. Siz fabrikinizdə createMyClass- dəyişənini götürən bir üsul yaradırsınız enum MyClassType. Aşağıdakı kod:
class CatFactory {
    public Cat createCat(CatType type) {

    }
}
Addım 5. Bütün enum dəyərləri arasında təkrarladığınız metodun gövdəsinə blok yazır və dəyərə switch-caseuyğun sinif nümunəsini yaradırsınız :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;
        }
    }
Patron kimi.

Necə məşq etmək

Oxumaq yaxşıdır, kod yazmaq daha yaxşıdır. Adınızın cüt hərfləri varsa, öz virtual pizzacınızı yaratmağa çalışın. Adınızın tək sayda hərfləri varsa, virtual suşi barı yaratmağa çalışın. Əgər anonimsinizsə, şanslısınız. Bu gün istirahət edə bilərsiniz.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION