JavaRush /Блоги Java /Random-TG /Намунаҳои тарроҳӣ: FactoryMethod

Намунаҳои тарроҳӣ: FactoryMethod

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо омӯзиши намунаҳои тарҳрезиро идома медиҳем ва дар бораи усули заводӣ (FactoryMethod) сӯҳбат мекунем. Намунаҳои тарроҳӣ: Методи Factory - 1Шумо мефаҳмед, ки ин чӣ аст ва ин қолаб барои кадом вазифаҳо мувофиқ аст. Мо ин тарҳро дар амал дида мебароем ва сохтори онро меомӯзем. Барои он ки ҳама чизҳои дар боло зикршуда ба шумо равшан бошанд, шумо бояд мавзӯъҳои зеринро фаҳмед:
  1. Мерос дар Java.
  2. Усулҳо ва синфҳои абстрактӣ дар Java.

Усули завод кадом масъаларо хал мекунад?

Дар хамаи накшахои лоихакашии завод ду гурухи иштироккунан-дагон — эчодкорон (худи заводхо) ва махсулот (an objectхое, ки заводхо сохтаанд) мавчуданд. Вазъиятро тасаввур кунед: мо заводе дорем, ки бо тамгаи AutoRush мошин мебарорад. Вай медонад, ки чӣ тавр сохтани моделҳои мошин бо намудҳои гуногуни бадан:
  • седанҳо
  • вагонхои станция
  • купе
Корҳо барои мо чунон хуб пеш мерафтанд, ки як рӯзи хуб мо нигаронии OneAuto-ро азхуд кардем. Ҳамчун менеҷерони оқил, мо намехоҳем муштариёни OneAuto-ро аз даст диҳем ва вазифаи мо аз он иборат аст, ки истеҳсолотро тавре таҷдид кунем, то истеҳсол кунем:
  • Седанҳои AutoRush
  • Вагонҳои истгоҳи AutoRush
  • купе AutoRush
  • Седанҳои OneAuto
  • Вагонҳои истгоҳи OneAuto
  • Купе OneAuto
Тавре ки шумо мебинед, ба ҷои як гурӯҳи маҳсулоти ҳосилшуда ду намуд пайдо шуд, ки бо баъзе ҷузъиёт фарқ мекунанд. Намунаи тарҳрезии усули заводӣ масъалаи эҷоди гурӯҳҳои гуногуни маҳсулотро ҳал мекунад, ки ҳар кадоми онҳо дорои хусусияти муайян мебошанд. Мо принсипи ин қолабро дар амал дида мебароем, ки тадриҷан аз содда ба мураккаб мегузарем, бо мисоли қаҳвахонаамон, ки дар яке аз лексияҳои қаблӣ таъсис дода будем .

Каме дар бораи қолаби завод

Ба шумо хотиррасон мекунам: мо бо шумо як қаҳвахонаи хурди виртуалӣ сохтем. Дар он мо омухтем, ки бо истифода аз як корхонаи оддӣ навъҳои гуногуни қаҳва созем. Имрӯз мо ин мисолро такмил медиҳем. Биёед ба хотир орем, ки кахвахонаи мо бо заводи оддй чй гуна буд. Мо синфи қаҳва доштем:
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 {}
Барои қулай будани қабули фармоиш мо интиқолҳоро ҷорӣ кардем:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Худи заводи қаҳва чунин менамуд:
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;
    }
}
Ва ниҳоят, худи қаҳвахона:
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;
    }
}

Модернизациям заводи оддй

Кахвахонаи мо нагз кор мекунад. То он дараҷае, ки мо дар бораи васеъ кардан фикр мекунем. Мо мехоҳем якчанд нуқтаҳои нав кушоем. Ҳамчун бачаҳои ташаббускор, мо қаҳвахонаҳои якрангро нест намекунем. Ман мехоҳам, ки ҳар яки онҳо тобиши худро дошта бошанд. Аз ин рӯ, барои оғози он, мо ду нуктаро мекушоем: дар сабкҳои итолиёвӣ ва амрикоӣ. Тағирот на танҳо ба корҳои дохилӣ, балки ба нӯшокиҳо низ таъсир мерасонад:
  • дар қаҳвахонаи итолиёвӣ мо танҳо брендҳои қаҳваи итолиёвиро бо суфтакунӣ ва бирёнкунии махсус истифода хоҳем кард.
  • Қисми амрикоӣ каме калонтар мешавад ва бо ҳар як фармоиш мо маршмалловҳои гудохташуда - маршмалловҳоро пешкаш мекунем.
Ягона чизе, ки бетағйир мемонад, модели тиҷорати мост, ки худро хуб исбот кардааст. Агар мо бо забони рамзӣ гап занем, ин ҳодиса рӯй медиҳад. Мо 4 намуди маҳсулот доштем:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Ва он 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 {}
Азбаски мо мехоҳем модели тиҷоратии ҷорӣро бетағйир нигоҳ дорем, мо мехоҳем, ки усул orderCoffee(CoffeeType type)ба ҳадди ақали тағйирот ворид шавад. Биёед ба он назар андозем:
public Coffee orderCoffee(CoffeeType type) {
    Coffee coffee = coffeeFactory.createCoffee(type);
    coffee.grindCoffee();
    coffee.makeCoffee();
    coffee.pourIntoCup();

    System.out.println("Вот ваш кофе! Спасибо, приходите еще!");
    return coffee;
}
Мо чӣ гуна имконот дорем? Мо аллакай медонем, ки фабрикаро чӣ гуна нависед? Чизи оддитарине, ки фавран ба хотир меояд, навиштани ду корхонаи якхела ва сипас татбиқи заруриро ба қаҳвахонаи мо дар конструктор интиқол додан аст. Он гох синфи кахвахона тагьир намеёбад. Аввалан, ба мо лозим аст, ки синфи нави завод эҷод кунем, аз корхонаи оддии худ мерос гирем ва createCoffee (CoffeeType type). Биёед заводҳоро барои сохтани қаҳва бо услубҳои итолиёвӣ ва амрикоӣ нависед:
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;
    }

}
Акнун мо метавонем татбиқи зарурии заводро ба CoffeeShop гузаронем. Биёед бубинем, ки рамзи фармоиши қаҳва аз қаҳвахонаҳои гуногун чӣ гуна хоҳад буд. Масалан, капучино дар услубҳои итолиёвӣ ва амрикоӣ:
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);
    }
}
Мо ду қаҳвахонаи гуногун таъсис додем, ки ҳар кадомро ба корхонаи зарурӣ интиқол додем. Аз як тараф ба максади худ расидем, аз тарафи дигар... Чизе рухи рафънашавандаи сохибкорро харошида истодааст... Биё фахмем, ки чи гунох дорад. Пеш аз хама, фаровонии заводхо. Оё мумкин аст, ки ҳар дафъа барои як нуқтаи нав корхонаи шахсии худро созед ва илова бар ин, боварӣ ҳосил кунед, ки ҳангоми ташкor қаҳвахона фабрикаи зарурӣ ба конструктор дода мешавад? Сониян, вай хануз заводи оддй аст. Танҳо каме замонавӣ. Мо то ҳол дар ин ҷо намунаи навро меомӯзем. Сеюм, магар ин корро дигар хел кардан мумкин нест? Хеле хуб мебуд, агар мо метавонем ҳама саволҳоро дар бораи қаҳва дар дохor синфхона ҷойгир кунем CoffeeShop, равандҳои эҷоди қаҳва ва хидматрасонии фармоишро пайваст кунем, аммо ҳамзамон чандирии кофӣ барои тайёр кардани қаҳва дар услубҳои гуногунро нигоҳ дорем. Ҷавоб ҳа, шумо метавонед. Ин намунаи тарҳрезии усули завод номида мешавад.

Аз заводи оддй ба усули заводй

Барои ҳалли ҳарчи самараноки мушкилот, мо:
  1. Биёед методро createCoffee(CoffeeType type)ба синф баргардонем CoffeeShop.
  2. Биёед ин усулро абстракт гардонем.
  3. Худи синф CoffeeShopабстрактӣ мешавад.
  4. Синф CoffeeShopворисон хоҳад дошт.
Ҳа, дӯст. Қаҳвахонаи итолиёвӣ ҷуз вориси синф чизе нест CoffeeShop, ки усулро createCoffee(CoffeeType type)мувофиқи анъанаҳои беҳтарини баристаҳои итолиёвӣ амалӣ мекунад. Пас, ба тартиб. Қадами 1. Биёед синфро Coffeeреферат кунем. Мо холо ду оилаи махсулоти гуногун дорем. Нӯшокиҳои қаҳваи итолиёвӣ ва амрикоӣ то ҳол як аҷдоди муштарак доранд: Coffee. Онро абстракт кардан дуруст мебуд:
public abstract class Coffee {
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
CoffeeShopҚадами 2. Онро абстракт, бо усули абстрактӣ созед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);
}
Қадами 3. Эҷоди як қаҳвахонаи итолиёвӣ, синфи насли қаҳвахонаи абстрактӣ. Дар он мо усулро createCoffee(CoffeeType type)бо назардошти хусусияти итолиёвӣ татбиқ мекунем.
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;
    }
}
Қадами 4. Биёед барои қаҳвахонаи услуби амрикоӣ низ ҳамин тавр кунем.
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. Биёед бубинем, ки фармоиш додани латте дар услуби амрикоӣ ва итолиёвӣ чӣ гуна хоҳад буд:
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);
    }
}
Табрик мекунем. Мо наваHow дар қаҳвахонаамон намунаи тарҳрезии усули фабрикаро ҷорӣ кардем.

Усули завод чй тавр кор мекунад

Акнун биёед ба он чизе, ки мо ба даст овардем, муфассалтар бубинем. Дар диаграммаи зер синфҳои натиҷавӣ нишон дода шудаанд. Блокҳои сабз синфҳои эҷодкорон, блокҳои кабуд синфҳои маҳсулот мебошанд. Намунаҳои тарроҳӣ: Методи Factory - 2Чӣ гуна хулосаҳоро баровардан мумкин аст?
  1. Ҳама маҳсулот татбиқи синфи абстрактӣ мебошанд Coffee.
  2. Ҳама эҷодкорон татбиқи синфи абстрактӣ мебошанд CoffeeShop.
  3. Мо ду иерархияи синфии параллелро мушоҳида мекунем:
    • Иерархияи маҳсулот. Мо наслҳои итолиёвӣ ва авлоди амрикоиро мебинем
    • Иерархияи эҷодкорон. Мо наслҳои итолиёвӣ ва авлоди амрикоиро мебинем
  4. Дар суперсинф CoffeeShopмаълумоте надорад, ки кадом татбиқи маҳсули мушаххас ( Coffee) эҷод мешавад.
  5. Суперкласс CoffeeShopэҷоди як маҳсулоти мушаххасро ба наслҳои худ вогузор мекунад.
  6. Хар як синфи авлод мувофики хусусияти худ CoffeeShopусули заводро ба амал мебарорад . createCoffee()Ба ибораи дигар, дар доираи татбиқи синфҳои эҷодкорон, қарор дар бораи тайёр кардани маҳсулоти мушаххас дар асоси хусусиятҳои синфи эҷодкорон қабул карда мешавад.
Акнун шумо омодаед намунаи усули заводро муайян кунед . Намунаи усули завод интерфейси сохтани an objectро муайян мекунад, аммо ба зерсинфҳо имкон медиҳад, ки синфи мисоли эҷодро интихоб кунанд. Ҳамин тариқ, усули Фабрика амалиёти инстансияро ба зерсинфҳо вогузор мекунад. Умуман, дар хотир нигоҳ доштани таъриф на он қадар муҳим аст, ки фаҳмидани он ки корҳо чӣ гуна кор мекунанд.

Сохтори усули завод

Намунаҳои тарроҳӣ: Методи Factory - 3Диаграммаи боло сохтори умумии намунаи усули заводро нишон медиҳад. Дар ин ҷо боз чӣ муҳим аст?
  1. Синфи Creator дорои татбиқи ҳама усулҳое мебошад, ки бо маҳсулот ҳамкорӣ мекунанд, ба истиснои усули заводӣ.
  2. Усули абстрактӣ factoryMethod()бояд аз ҷониби ҳамаи наслҳои синф амалӣ карда шавад Creator.
  3. Синф ConcreteCreatorусулеро татбиқ мекунад factoryMethod(), ки бевосита маҳсулот истеҳсол мекунад.
  4. Ин синф барои эҷоди маҳсулоти мушаххас масъул аст. Ин ягона синфест, ки дар бораи эҷоди ин маҳсулот маълумот дорад.
  5. Ҳама маҳсулот бояд интерфейси умумиро татбиқ кунанд - насли як синфи умумии маҳсулот бошанд. Ин зарур аст, то синфҳое, ки маҳсулотро истифода мебаранд, дар сатҳи абстраксияҳо кор кунанд, на татбиқи мушаххас.

Вазифаи хонагӣ

Инак, имруз мо кори бисьёреро ба чо овардем ва намунаи конструк-цияи усули заводро омухтем. Вақти он расидааст, ки маводҳои дар баркардаатонро муттаҳид кунед! Вазифаи 1. Кор оид ба кушодани қаҳвахонаи дигар. Он метавонад бо услуби англисӣ ё испанӣ сохта шавад. Ё ҳатто дар услуби киштии кайҳонӣ. Биёед ба қаҳва ранги ғизо илова кунем, то он дурахшон шавад ва дар маҷмӯъ, қаҳва танҳо фазо хоҳад буд! Вазифаи 2. Дар лексияи охирин шумо вазифадор будед, ки суши-барҳои виртуалӣ ё пиццерияи виртуалӣ эҷод кунед. Вазифаи шумо дар як ҷо истодан нест. Имрӯз шумо фаҳмидед, ки чӣ тавр шумо намунаи усули заводро барои ноил шудан ба муваффақият истифода бурдан мумкин аст. Вақти он расидааст, ки аз ин дониш истифода баред ва тиҷорати худро васеъ кунед;)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION