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

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

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо омӯзиши намунаҳои тарроҳиро идома медиҳем ва дар бораи фабрикаи абстрактӣ сӯҳбат мекунем . Намунаҳои тарроҳӣ: AbstractFactory - 1Мо дар давоми лексия чӣ кор хоҳем кард:
  • Биёед дида бароем, ки фабрикаи абстрактй чист ва ин намуна чй масъаларо хал мекунад;
  • мо чаҳорчӯбаи барномаи кросс-платформаро барои фармоиш додани қаҳва бо интерфейси корбар эҷод хоҳем кард;
  • Биёед дастурҳои истифодаи ин намунаро бо диаграмма ва code омӯзем;
  • Ҳамчун бонус, дар лексия тухми Пасха пинҳон аст, ки ба шарофати он шумо бо истифода аз Java муайян кардани номи системаи оператсиониро меомӯзед ва вобаста ба натиҷа ин ё он амалро иҷро мекунед.
Барои пурра фаҳмидани ин намуна, шумо бояд фаҳмиши хуби мавзӯъҳои зерин дошта бошед:
  • мерос дар Java;
  • синфҳо ва усулҳои абстрактӣ дар Java.

Намунаи абстрактии фабрика кадом масъалахоро хал мекунад?

Заводи абстрактй мисли хамаи намунахои заводй ба мо дар кори дуруст ташкил намудани an objectхои нав ёрй мерасонад. Бо ёрии он мо «баровардани» оилахои гуногуни an objectхои ба хам алокамандро идора мекунем. Оилахои гуногуни an objectхои ба хам алокаманд... Ин чист? Парво накунед: дар амал ҳама чиз осонтар аз он аст, ки ба назар мерасад. Биёед аз он оғоз кунем, ки оилаи an objectҳои ба ҳам алоқаманд чӣ гуна буда метавонад? Фарз мекунем, ки шумо ва ман стратегияеро таҳия карда истодаем ва дар он якчанд воҳидҳои ҷангӣ мавҷуданд:
  • пиёдагард;
  • савора;
  • камонварон.
Ин гуна кисмхои чангй бо хам ало-каманданд, зеро онхо дар як армия хизмат мекунанд. Мо гуфта метавонем, ки категорияҳои дар боло номбаршуда як оилаи an objectҳои ба ҳам алоқаманд мебошанд. Ин тартиб дода шудааст. Аммо намунаи абстрактии завод барои ташкor оилаҳои гуногуни an objectҳои ба ҳам алоқаманд истифода мешавад. Дар ин ҷо ҳам ҳеҷ чизи мураккаб нест. Биёед мисолро бо стратегия идома диҳем. Онҳо одатан якчанд ҷонибҳои муқобил доранд. Воҳидҳои ҷангии ҷонибҳои гуногун метавонанд дар намуди зоҳирӣ ба таври назаррас фарқ кунанд. Сарбозони пиёда, савора ва камонварони артиши Рум ба аскарони пиёда, савора ва камонварони викингҳо монанд нестанд. Дар доираи стратегия, сарбозони артишҳои гуногун оилаҳои гуногуни an objectҳои ба ҳам алоқаманд мебошанд. Хандаовар мебуд, ки агар бо иштибоҳи барномасоз як сарбози либоси фаронсавӣ дар тан аз замони Наполеон бо мушкет дар ҳоли ҳозир дар байни аскарони пиёдагарди румӣ сайру гашт мекард. Махз барои халли чунин масъала намунаи конструктории абстрактии фабрика зарур аст. Не, на мушкилоти саёҳати вақт хиҷолат, балки ташкor гурӯҳҳои гуногуни an objectҳои ба ҳам алоқаманд. Заводи абстрактӣ интерфейсро барои эҷоди тамоми маҳсулоти мавҷуда (an objectҳои оилавӣ) таъмин мекунад. Заводи абстрактӣ одатан якчанд амалия дорад. Ҳар яки онҳо барои эҷоди маҳсулоти яке аз вариантҳо масъуланд. Дар доираи стратегия мо як корхонаи абстрактӣ дошта бошем, ки аскарони абстрактии пиёдагард, камонварон ва савораҳо, инчунин татбиқи ин корхонаро эҷод мекунад. Фабрикае, ки легионерҳои румӣ эҷод мекунад ва масалан, як корхонае, ки ҷанговарони Карфагениро эҷод мекунад. Абстраксия муҳимтарин принсипи ин намуна аст. Мизоҷони завод бо он ва бо маҳсулот танҳо тавассути интерфейсҳои абстрактӣ кор мекунанд. Аз ин рӯ, мо набояд фикр кунем, ки мо чӣ гуна ҷанговаронро дар айни замон эҷод карда истодаем, балки ин масъулиятро ба ягон амали мушаххаси фабрикаи абстрактӣ супорем.

Мо автоматикунонии кахвахонаро давом дода истодаем

Дар лекциям гузашта мо намунаи усули фабрикиро омухтем, ки бо ёрии он бизнеси кахваро вусъат дода, якчанд нуктахои нави фуруши кахва кушоем. Имрӯз мо кори худро барои навсозии тиҷорати худ идома медиҳем. Бо истифода аз намунаи абстрактии завод, мо барои як барномаи нави мизи корӣ барои фармоиши қаҳва онлайн замина мегузорем. Вақте ки мо барои мизи корӣ ариза менависем, мо бояд ҳамеша дар бораи кросс-платформа фикр кунем. Замимаи мо бояд ҳам дар MacOS ва ҳам дар Windows кор кунад (спойлер: Linux барои шумо ҳамчун вазифаи хонагӣ боқӣ мемонад). Аризаи мо чӣ гуна хоҳад буд? Хеле оддӣ: он шакле хоҳад буд, ки аз майдони матн, майдони интихоб ва тугма иборат аст. Агар шумо таҷрибаи истифодаи системаҳои гуногуни оператсионӣ дошта бошед, шумо бешубҳа пай бурдед, ки дар Windows тугмаҳо нисбат ба Mac ба таври дигар иҷро карда мешаванд. Мисли ҳама чизи дигар... Пас, биёед оғоз кунем. Дар нақши оилаҳои маҳсулот, тавре ки шумо аллакай фаҳмидед, мо унсурҳои интерфейси графикӣ хоҳем дошт:
  • тугмаҳо;
  • майдонҳои матн;
  • майдонҳо барои интихоб.
Радди масъулият. Дар дохor ҳар як интерфейс мо метавонем усулҳоро ба монанди onClick, onValueChangedё муайян кунем onInputChanged. Онхое. усулҳое, ки ба мо имкон медиҳанд, ки рӯйдодҳои гуногунро идора кунем (ангуштзании тугма, ворид кардани матн, интихоби арзиш дар қуттии интихоб). Хамаи ин дидаю дониста сарфи назар карда мешавад, то ки мисолро аз хад зиёд бор накунанд ва барои омухтани намунаи завод бештар аёнй гардонанд. Биёед интерфейсҳои абстрактиро барои маҳсулоти мо муайян кунем:
public interface Button {}
public interface Select {}
public interface TextField {}
Барои ҳар як системаи амалиётӣ, мо бояд унсурҳои интерфейсро бо услуби он системаи оператсионӣ созем. Мо барои Windows ва MacOS менависем. Биёед амалияҳоро барои Windows эҷод кунем:
public class WindowsButton implements Button {
}

public class WindowsSelect implements Select {
}

public class WindowsTextField implements TextField {
}
Ҳоло ҳамон барои MacOS:
public class MacButton implements Button {
}

public class MacSelect implements Select {
}

public class MacTextField implements TextField {
}
бузург. Акнун мо метавонем фабрикаи абстрактии худро оғоз кунем, ки он ҳама навъҳои абстрактии маҳсулоти мавҷударо эҷод мекунад:
public interface GUIFactory {

    Button createButton();
    TextField createTextField();
    Select createSelect();

}
Комил. Тавре ки шумо мебинед, ҳеҷ чиз то ҳол мураккаб нест. Он гоҳ ҳама чиз оддӣ аст. Дар муқоиса бо маҳсулот, мо барои ҳар як ОС татбиқи гуногуни корхонаи худро эҷод мекунем. Биёед бо Windows оғоз кунем:
public class WindowsGUIFactory implements GUIFactory {
    public WindowsGUIFactory() {
        System.out.println("Creating gui factory for Windows OS");
    }

    public Button createButton() {
        System.out.println("Creating Button for Windows OS");
        return new WindowsButton();
    }

    public TextField createTextField() {
        System.out.println("Creating TextField for Windows OS");
        return new WindowsTextField();
    }

    public Select createSelect() {
        System.out.println("Creating Select for Windows OS");
        return new WindowsSelect();
    }
}
Натиҷаи консол дар дохor усулҳо ва конструкторҳо барои нишон додани минбаъдаи он, ки чӣ тавр кор мекунад, илова карда шудааст. Ҳоло барои macOS:
public class MacGUIFactory implements GUIFactory {
    public MacGUIFactory() {
        System.out.println("Creating gui factory for macOS");
    }

    @Override
    public Button createButton() {
        System.out.println("Creating Button for macOS");
        return new MacButton();
    }

    @Override
    public TextField createTextField() {
        System.out.println("Creating TextField for macOS");
        return new MacTextField();
    }

    @Override
    public Select createSelect() {
        System.out.println("Creating Select for macOS");
        return new MacSelect();
    }
}
Эзоҳ: ҳар як усул, мувофиқи имзои худ, навъи абстрактиро бармегардонад. Аммо дар дохor усул мо татбиқи мушаххаси маҳсулотро эҷод мекунем. Ин ягона ҷойест, ки мо эҷоди мисолҳои мушаххасро назорат мекунем. Ҳоло вақти навиштани синфи форма расидааст. Ин синфи Java аст, ки майдонҳои он унсурҳои интерфейс мебошанд:
public class OrderCoffeeForm {
    private final TextField customerNameTextField;
    private final Select coffeTypeSelect;
    private final Button orderButton;

    public OrderCoffeeForm(GUIFactory factory) {
        System.out.println("Creating order coffee form");
        customerNameTextField = factory.createTextField();
        coffeTypeSelect = factory.createSelect();
        orderButton = factory.createButton();
    }
}
Заводи абстрактӣ ба конструктори форма мегузарад, ки унсурҳои интерфейсро эҷод мекунад. Мо татбиқи зарурии заводро ба конструктор мегузорем, то мо метавонем унсурҳои интерфейсро барои ОС мушаххас созем.
public class Application {
    private OrderCoffeeForm orderCoffeeForm;

    public void drawOrderCoffeeForm() {
        // Определим Name операционной системы, получив meaning системной проперти через System.getProperty
        String osName = System.getProperty("os.name").toLowerCase();
        GUIFactory guiFactory;

        if (osName.startsWith("win")) { // Для windows
            guiFactory = new WindowsGUIFactory();
        } else if (osName.startsWith("mac")) { // Для mac
            guiFactory = new MacGUIFactory();
        } else {
            System.out.println("Unknown OS, can't draw form :( ");
            return;
        }
        orderCoffeeForm = new OrderCoffeeForm(guiFactory);
    }

    public static void main(String[] args) {
        Application application = new Application();
        application.drawOrderCoffeeForm();
    }
}
Агар мо барномаро дар Windows иҷро кунем, мо натиҷаи зеринро мегирем:

Creating gui factory for Windows OS
Creating order coffee form
Creating TextField for Windows OS
Creating Select for Windows OS
Creating Button for Windows OS
Дар Mac баромад чунин хоҳад буд:

Creating gui factory for macOS
Creating order coffee form
Creating TextField for macOS
Creating Select for macOS
Creating Button for macOS
Дар Linux:

Unknown OS, can't draw form :( 
Хуб, ману шумо чунин хулоса мебарорем. Мо чаҳорчӯба барои барномаи GUI навиштем, ки маҳз ҳамон унсурҳои интерфейсро эҷод мекунад, ки барои OS мувофиқанд. Биёед ба таври мухтасар он чизеро, ки мо офаридаем, такрор кунем:
  • Оилаи маҳсулот: майдони вуруд, майдони интихоб ва тугма.
  • Амалисозии гуногуни ин оилаи маҳсулот барои Windows ва macOS.
  • Заводи абстрактӣ, ки дар дохor он мо интерфейси эҷоди маҳсулоти худро муайян кардем.
  • Ду амалисозии заводи мо, ки ҳар яки онҳо барои эҷоди як оилаи мушаххаси маҳсулот масъуланд.
  • Форма, синфи Java, ки майдонҳои онҳо унсурҳои абстрактии интерфейс мебошанд, ки дар конструктор бо арзишҳои зарурӣ бо истифода аз заводи абстрактӣ оғоз карда мешаванд.
  • Синфи ариза. Дар дохor он мо шакле месозем, ки бо он татбиқи зарурии корхонаи худро ба конструктор мегузорем.
Ҳамагӣ: мо намунаи абстрактии заводро ба амал овардем.

Заводи реферат: дастур барои истифода

Фабрикаи абстрактӣ як намунаи тарроҳӣ барои идоракунии эҷоди оилаҳои гуногуни маҳсулот бидуни вобастагӣ ба синфҳои мушаххаси маҳсулот мебошад. Ҳангоми истифодаи ин қолаб, шумо бояд:
  1. Худи оилаҳои маҳсулотро муайян кунед. Фарз мекунем, ки мо дутои онҳоро дорем:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. Барои ҳар як маҳсулот дар дохor оила синфи абстрактӣ (интерфейс) муайян кунед. Дар ҳолати мо ин аст:
    • ProductA
    • ProductB
  3. Дар дохor ҳар як оилаи маҳсулот, ҳар як маҳсулот бояд интерфейси дар қадами 2 муайяншударо татбиқ кунад.
  4. Фабрикаи абстрактӣ эҷод кунед, ки усулҳои эҷоди ҳар як маҳсулот дар қадами 2 муайян карда шудааст. Дар ҳолати мо, ин усулҳо инҳоянд:
    • ProductA createProductA();
    • ProductB createProductB();
  5. Таҷҳизоти фабрикаи абстрактӣ эҷод кунед, то ҳар як амалисозӣ эҷоди маҳсулоти як оиларо назорат кунад. Барои ин дар дохor хар як амалисозии фабрикаи абстрактй хамаи усулхои эчодиро ба амал баровардан лозим аст, то ки дар дохor онхо тачхизоти конкретии махсулот ба вучуд оварда, баргардонда шавад.
Дар зер диаграммаи UML оварда шудааст, ки дастурҳои дар боло тавсифшударо нишон медиҳад: Намунаҳои тарроҳӣ: AbstractFactory - 3Акнун биёед codeи ин дастурро нависед:
// Определим общие интерфейсы продуктов
public interface ProductA {}
public interface ProductB {}

// Создадим различные реализации (семейства) наших продуктов
public class SpecificProductA1 implements ProductA {}
public class SpecificProductB1 implements ProductB {}

public class SpecificProductA2 implements ProductA {}
public class SpecificProductB2 implements ProductB {}

// Создадим абстрактную фабрику
public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// Создадим реализацию абстрактной фабрики для создания продуктов семейства 1
public class SpecificFactory1 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB1();
    }
}

// Создадим реализацию абстрактной фабрики для создания продуктов семейства 1
public class SpecificFactory2 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB2();
    }
}

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

Барои муттаҳид кардани мавод шумо метавонед ду чизро иҷро кунед:
  1. Замимаи фармоиши қаҳваро такмил диҳед, то он дар Linux кор кунад.
  2. Барои истеҳсоли воҳидҳои ҳама гуна стратегия як корхонаи абстрактии худро эҷод кунед. Ин метавонад ё як стратегияи таърихӣ бо лашкарҳои воқеӣ ё фантазия бо оркҳо, карликҳо ва элфҳо бошад. Муҳим он аст, ки шумо онро ҷолиб меҳисобед. Эҷодкор бошед, ба консол пинҳо гузоред ва аз омӯхтани намунаҳо лаззат баред!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION