JavaRush /Java блогу /Random-KY /Заводдук дизайн үлгүсү

Заводдук дизайн үлгүсү

Группада жарыяланган
Салам дос! Бүгүн биз сиздер менен дизайн үлгүлөрүн изилдөөнү улантабыз. Бул лекцияда биз Фабрика жөнүндө сөз кылабыз. Биз сиз менен бул шаблон аркылуу кандай көйгөй чечилерин талкуулайбыз жана фабрика кофе дүкөнүн ачууга кандайча жардам бергенин мисалга келтиребиз. Ошондой эле мен сизге фабрика түзүү үчүн 5 жөнөкөй кадамдарды берем. Заводдук дизайн үлгүсү - 1Баары менен бир бетте болуу жана маңызын оңой түшүнүү үчүн, сиз төмөнкү темалар менен тааныш болушуңуз керек:
  • Javaдагы мурас
  • Java тorндеги маалымдама түрлөрүн кыскартуу жана кеңейтүү
  • Ар кандай класстардын жана an objectтердин өз ара аракеттенүүсү

Фабрика деген эмне?

Фабрика дизайн үлгүсү an objectилерди түзүүнү башкарууга мүмкүндүк берет. Жаңы an objectти түзүү процесси анчалык деле жөнөкөй эмес, бирок өтө татаал да эмес. Жаңы an objectти түзүү үчүн биз new. Бул жерде башкара турган эч нерсе жоктой сезorши мүмкүн, бирок андай эмес. Биздин тиркемеде көптөгөн тукумдары бар белгилүү бир класс болгондо кыйынчылыктар пайда болушу мүмкүн жана кээ бир шарттарга жараша белгилүү бир класстын үлгүсүн түзүү зарыл. Фабрика - бул кандайдыр бир шарттарга жараша ар кандай an objectтерди түзүү маселесин чечүүгө жардам берген дизайн үлгүсү. Абстракттуу, туурабы? Төмөндөгү мисалды караганыбызда көбүрөөк конкреттүүлүк жана айкындык пайда болот.

Биз кофенин ар кандай түрлөрүн жасайбыз

Биз кофе дүкөнүн автоматташтыргыбыз келет дейли. Биз кофенин ар кандай түрлөрүн жасаганды үйрөнүшүбүз керек. Бул үчүн, биздин тиркемеде биз кофе классын жана анын туундуларын түзөбүз: Americano, капучино, эспрессо, латте - биз даярдай турган кофенин түрлөрү. Жалпы кофе классынан баштайлы:
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-кадам. Методдун корпусуна блок жазасыз, анда сиз бардык enum маанилери аркылуу кайталап, мааниге 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