JavaRush /Java блогы /Random-KK /Зауыттық дизайн үлгісі

Зауыттық дизайн үлгісі

Топта жарияланған
Сәлем дос! Бүгін біз сіздермен дизайн үлгілерін зерттеуді жалғастырамыз. Бұл лекцияда біз Фабрика туралы айтатын боламыз. Біз сіздермен осы үлгіні пайдаланып қандай мәселе шешілетінін талқылаймыз және фабриканың кофехана ашуға қалай көмектесетінінің мысалын қарастырамыз. Мен сізге зауыт құрудың 5 қарапайым қадамын беремін. Зауыттық дизайн үлгісі - 1Барлығымен бір бетте болу және оның мәнін оңай түсіну үшін келесі тақырыптармен таныс болуыңыз керек:
  • Java тіліндегі мұра
  • Java тіліндегі сілтеме түрлерін тарылту және кеңейту
  • Әртүрлі класстар мен an objectілердің өзара әрекеттесуі

Зауыт дегеніміз не?

Зауыттық дизайн үлгісі нысандарды құруды басқаруға мүмкіндік береді. Жаңа нысанды жасау процесі соншалықты қарапайым емес, бірақ тым күрделі де емес. Жаңа нысан жасау үшін пайдалану керек екенін бәріміз білеміз new. Бұл жерде басқаруға ештеңе жоқ сияқты көрінуі мүмкін, бірақ олай емес. Біздің қолданбада көптеген ұрпақтары бар белгілі бір класс болған кезде қиындықтар туындауы мүмкін және кейбір шарттарға байланысты белгілі бір сыныптың данасын жасау қажет. Зауыт - бұл кейбір шарттарға байланысты әртүрлі an objectілерді құру мәселесін шешуге көмектесетін дизайн үлгісі. Аннотация, солай емес пе? Төмендегі мысалды қараған кезде нақтылық пен айқындық пайда болады.

Біз кофенің әртүрлі түрлерін жасаймыз

Біз кофехананы автоматтандырғымыз келеді делік. Біз кофенің әртүрлі түрлерін дайындауды үйренуіміз керек. Ол үшін біздің қосымшамызда кофе класын және оның туындыларын жасаймыз: американо, капучино, эспрессо, латте - біз дайындайтын кофе түрлері. Жалпы кофе класынан бастайық:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
Енді оның мұрагерлерін құрайық:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Біздің тұтынушылар кофенің қандай да бір түріне тапсырыс береді және бұл ақпаратты бағдарламаға жіберу керек. Мұны әртүрлі жолдармен жасауға болады, мысалы, көмегімен String. Бірақ бұл мақсаттар үшін ең қолайлы enum. enumОнда біз тапсырыс қабылдайтын кофе түрлерін жасап , анықтайық:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Керемет, енді кофехананың codeын жазайық:
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;
    }
}
Бұл әдісті orderCoffeeекі компонентке бөлуге болады:
  1. Блокта белгілі бір кофе данасын жасау switch-case. Бұл жерде Зауыт шартқа байланысты белгілі бір түрін жасайды.
  2. Дайындықтың өзі ұнтақтау, пісіру және кесеге құю.
Болашақта әдіске өзгертулер енгізу қажет пе, нені білу маңызды:
  1. Дайындау алгоритмінің өзі (ұнтақтау, пісіру және кесеге құю) өзгеріссіз қалады (кем дегенде біз солай деп үміттенеміз).
  2. Бірақ кофе ассортименті өзгеруі мүмкін. Бәлкім, моча.. Моча.. Моккачи жасай бастаймыз... Құдай жарылқасын, кофенің жаңа түрі.
Біз болашақта белгілі бір ықтималдық дәрежесімен әдіске, блокқа өзгертулер енгізуге тура келеді деп болжауға болады switch-case. orderCoffeeБіздің кофеханада бұл әдіс кофенің әртүрлі түрлерін жасайтын жалғыз орын болмауы мүмкін . Сондықтан бірнеше жерде өзгерістер енгізуге тура келеді. Сіз менің немен айналысып жатқанымды түсінген шығарсыз. Бізге рефактор керек. Кофе жасауға жауапты блокты екі себеп бойынша бөлек сыныпқа жылжытыңыз:
  1. Біз кофе жасау логикасын басқа жерлерде қайта пайдалана аламыз.
  2. Егер ауқым өзгерсе, кофе жасау қолданылатын барлық жерде codeты өңдеудің қажеті болмайды. Тек бір жерде codeты өзгерту жеткілікті болады.
Яғни, зауытты қысқартатын кез келді.

Біз алғашқы зауытымызды аралап жатырмыз

Мұны істеу үшін кофе кластарының қажетті даналарын жасауға ғана жауап беретін жаңа класс құрайық:
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;
    }
}
Құттықтаймын! Біз жай ғана зауыттық дизайн үлгісін қарапайым түрде енгіздік. Дегенмен, егер әдіс createCoffeeстатикалық болса, бәрі оңайырақ болуы мүмкін. Бірақ ол кезде біз екі мүмкіндікті жоғалтамыз:
  1. мұрағат алу SimpleCoffeeFactoryжәне қайта анықтау createCoffee.
  2. Біздің сабақтарда қажетті зауыттық енгізуді енгізіңіз.
Іске асыру туралы айтатын болсақ. Біз кофеханаға оралып, кофе жасау зауытын іске асыруымыз керек.

Фабриканы кофеханаға енгізу

Фабрика арқылы кофехана класын қайта жазайық:
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;
    }
}
Тамаша. Енді зауыттық дизайн үлгісінің құрылымын схемалық және қысқаша сипаттауға тырысайық.

Өз зауытыңызды ашудың 5 қадамы

1-қадам. Бағдарламаңызда төмендегі суреттегідей бірнеше ұрпақтары бар сынып бар: 2-қадам . Әрбір ұрпақ класы үшін enum айнымалы мәнін анықтайтын Зауыттық дизайн үлгісі - 2класс жасайсыз :enum
enum CatType {
    LION,
    TIGER,
    BARSIK
}
3-қадам. Сіз өз зауытыңызды саласыз. Сіз оны шақырасыз MyClassFactory, code төменде:
class CatFactory {}
4-қадам. Сіз зауытта createMyClass- айнымалысын қабылдайтын әдісті жасайсыз enum MyClassType. Төмендегі code:
class CatFactory {
    public Cat createCat(CatType type) {

    }
}
5-қадам. Сіз барлық санау мәндері арқылы қайталанатын әдістің негізгі бөлігіне блок жазасыз және мәнге switch-caseсәйкес класс данасын жасайсыз :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;
        }
    }
Бастық сияқты.

Қалай жаттықтыру керек

Оқу жақсы, code жазу одан да жақсы. Егер атыңызда жұп әріптер болса, өзіңіздің виртуалды пиццерияңызды жасап көріңіз. Егер атыңызда тақ әріптер болса, виртуалды суши жолағын жасап көріңіз. Егер сіз анонимді болсаңыз, сіз бақыттысыз. Бүгін демалуға болады.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION