JavaRush /Java блогы /Random-KK /Дизайн үлгілері: AbstractFactory

Дизайн үлгілері: AbstractFactory

Топта жарияланған
Сәлеметсіз бе! Бүгін біз дизайн үлгілерін зерттеуді жалғастырамыз және дерексіз фабрика туралы сөйлесеміз . Дизайн үлгілері: AbstractFactory - 1Дәріс барысында не істейміз:
  • Абстрактілі фабрика дегеніміз не және бұл үлгі қандай мәселені шешетінін талқылайық;
  • пайдаланушы интерфейсі бар кофеге тапсырыс беруге арналған кросс-платформалық қосымшаның негізін жасаймыз;
  • Осы үлгіні диаграммамен және codeпен пайдалану нұсқауларын зерттейік;
  • Бонус ретінде лекцияда жасырылған Пасха жұмыртқасы бар, соның арқасында сіз Java көмегімен операциялық жүйенің атын анықтауды үйренесіз және нәтижеге байланысты бір немесе басқа әрекетті орындайсыз.
Бұл үлгіні толық түсіну үшін келесі тақырыптарды жақсы түсіну керек:
  • Java тіліндегі мұра;
  • Java тіліндегі абстрактілі сыныптар мен әдістер.

Абстрактілі зауыт үлгісі қандай мәселелерді шешеді?

Абстрактілі фабрика, барлық зауыт үлгілері сияқты, бізге жаңа an objectілерді құруды дұрыс ұйымдастыруға көмектеседі. Оның көмегімен біз өзара байланысты an objectілердің әртүрлі отбасыларының «шығаруын» басқарамыз. Бір-бірімен байланысты an objectілердің әртүрлі отбасылары...Бұл не? Уайымдамаңыз: іс жүзінде бәрі көрінгеннен оңайырақ. Байланысты an objectілер тобы не болуы мүмкін екенін бастайық? Сіз және мен стратегияны әзірлеп жатырмыз делік және онда бірнеше жауынгерлік бөлімшелер бар:
  • жаяу әскер;
  • атты әскер;
  • садақшылар.
Бұл жауынгерлік бөлімшелердің түрлері бір-бірімен байланысты, өйткені олар бір армияда қызмет етеді. Жоғарыда аталған категориялар өзара байланысқан an objectілер тобы деп айта аламыз. Бұл реттелді. Бірақ дерексіз зауыт үлгісі өзара байланысты an objectілердің әртүрлі отбасыларын құруды ұйымдастыру үшін қолданылады . Мұнда да күрделі ештеңе жоқ. Мысалды стратегиямен жалғастырайық. Олардың әдетте бірнеше қарама-қарсы жақтары болады. Әртүрлі жақтардың жауынгерлік бөлімшелері сыртқы түрі бойынша айтарлықтай ерекшеленуі мүмкін. Рим әскерінің жаяу сарбаздары, салт аттылары мен садақшылары викингтердің жаяу әскерлері, аттылары мен садақшыларымен бірдей емес. Стратегия аясында әртүрлі армиялардың сарбаздары өзара байланысты an objectілердің әртүрлі отбасылары болып табылады. Егер бағдарламашының қателігімен Наполеон кезіндегі француз формасын киген жауынгер римдік жаяу әскерлердің арасында мушкеті дайын болса, қызық болар еді. Дәл осындай мәселені шешу үшін дерексіз зауыттық дизайн үлгісі қажет. Жоқ, уақыт саяхатының ыңғайсыздығы проблемалары емес, өзара байланысты an objectілердің әртүрлі топтарын құру. Абстрактілі зауыт барлық бар өнімдерді (отбасылық нысандар) жасау үшін интерфейсті қамтамасыз етеді. Абстрактілі зауытта әдетте бірнеше енгізулер болады. Олардың әрқайсысы вариациялардың бірінің өнімдерін жасауға жауапты. Стратегияның бір бөлігі ретінде бізде абстрактілі жаяу әскерлерді, садақшылар мен атты әскерлерді жасайтын абстрактілі зауыт, сондай-ақ осы зауыттың іске асырылуы болар еді. Римдік легионерлерді жасайтын зауыт және, мысалы, Карфагендік жауынгерлерді жасайтын зауыт. Абстракция - бұл үлгінің ең маңызды принципі. Зауыттық клиенттер онымен және өнімдермен тек дерексіз интерфейстер арқылы жұмыс істейді. Сондықтан, біз қазіргі уақытта қандай жауынгерлерді жасап жатқанымыз туралы ойланудың қажеті жоқ, бірақ бұл жауапкершілікті дерексіз зауыттың белгілі бір іске асыруына тапсырамыз.

Біз кофехананы автоматтандыруды жалғастырамыз

Соңғы дәрісте біз зауыттық әдіс үлгісін зерттедік, оның көмегімен кофе бизнесін кеңейтіп, бірнеше жаңа кофе сату нүктелерін аша алдық. Бүгін біз бизнесімізді жаңғырту бойынша жұмысымызды жалғастырамыз. Зауыттық дерексіз үлгіні пайдалана отырып, біз кофеге онлайн тапсырыс беруге арналған жаңа жұмыс үстелі қосымшасының негізін қалаймыз. Жұмыс үстеліне қосымшаны жазғанда, біз әрқашан кросс-платформа туралы ойлануымыз керек. Біздің қолданба macOS және Windows жүйелерінде де жұмыс істеуі керек (спойлер: Linux сізге үй тапсырмасы ретінде қалдырылады). Біздің өтініміміз қандай болады? Өте қарапайым: бұл мәтіндік өрістен, таңдау өрісінен және түймелерден тұратын пішін болады. Егер сізде әртүрлі операциялық жүйелерді пайдалану тәжірибеңіз болса, Windows жүйесінде түймелер Mac жүйесіне қарағанда басқаша көрсетілетінін байқадыңыз. Бәрі сияқты... Ендеше, бастайық. Өнім отбасыларының рөлінде сіз түсінген боларсыз, бізде графикалық интерфейс элементтері болады:
  • түймелер;
  • мәтіндік өрістер;
  • таңдауға арналған өрістер.
Жауапкершіліктен бас тарту. Әрбір интерфейсте біз 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();
    }
}
Оның қалай жұмыс істейтінін одан әрі көрсету үшін әдістер мен конструкторлар ішіндегі консоль шығысы қосылды. Енді 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();
    }
}
Ескерту: әрбір әдіс қолтаңбасына сәйкес дерексіз түрін қайтарады. Бірақ әдістің ішінде біз өнімнің нақты орындалуын жасаймыз. Бұл нақты даналардың жасалуын бақылайтын жалғыз орын. Енді форма класын жазу уақыты келді. Бұл өрістері интерфейс элементтері болып табылатын 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 қолданбасы үшін құрылымды жаздық. Біз жасаған нәрсені қысқаша қайталайық:
  • Өнімдер тобы: енгізу өрісі, таңдау өрісі және түйме.
  • Windows және macOS үшін осы өнімдер тобының әртүрлі енгізулері.
  • Біз өз өнімдерімізді жасау интерфейсін анықтаған дерексіз зауыт.
  • Біздің зауыттың екі нұсқасы, олардың әрқайсысы өнімдердің белгілі бір тобын құруға жауапты.
  • Пішін, Java класы, оның өрістері абстрактілі зауытты пайдаланып қажетті мәндермен конструкторда инициализацияланған дерексіз интерфейс элементтері болып табылады.
  • Қолдану класы. Оның ішінде біз конструкторға зауыттың қажетті орындалуын беретін пішінді жасаймыз.
Барлығы: біз дерексіз зауыт үлгісін енгіздік.

Реферат фабрикасы: пайдалану жөніндегі нұсқаулық

Реферат фабрикасы - бұл белгілі бір өнім сыныптарына байланыстырмай, әртүрлі өнім топтарын құруды басқаруға арналған дизайн үлгісі. Бұл үлгіні пайдаланған кезде сізге қажет:
  1. Өнім отбасыларының өздерін анықтаңыз. Бізде олардың екеуі бар делік:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. Отбасы ішіндегі әрбір өнім үшін дерексіз классты (интерфейс) анықтаңыз. Біздің жағдайда бұл:
    • ProductA
    • ProductB
  3. Әрбір өнім тобында әрбір өнім 2-қадамда анықталған интерфейсті енгізуі керек.
  4. 2-қадамда анықталған әрбір өнім үшін жасау әдістерімен дерексіз зауыт жасаңыз. Біздің жағдайда бұл әдістер келесідей болады:
    • ProductA createProductA();
    • ProductB createProductB();
  5. Әрбір іске асыру бір отбасының өнімдерін жасауды бақылайтындай абстрактілі фабриканың іске асыруларын жасаңыз. Ол үшін абстрактілі фабриканың әрбір іске асыруының ішінде өнімдердің нақты іске асырылулары құрылып, олардың ішінде қайтарылатындай барлық жасау әдістерін енгізу қажет.
Төменде жоғарыда сипатталған нұсқауларды бейнелейтін 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();
    }
}

Үй жұмысы

Материалды бекіту үшін 2 әрекетті орындауға болады:
  1. Кофеге тапсырыс беру қолданбасын Linux жүйесінде жұмыс істейтіндей жақсартыңыз.
  2. Кез келген стратегияның бірліктерін шығару үшін өзіңіздің дерексіз зауытыңызды жасаңыз. Бұл нақты әскерлермен тарихи стратегия немесе орктармен, гномдармен және эльфтермен қиялдау болуы мүмкін. Ең бастысы, бұл сізге қызықты. Шығармашылықпен айналысыңыз, консольге түйреуіштерді орналастырыңыз және үлгілерді үйреніңіз!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION