Salam, dost! Bu gün biz sizinlə dizayn nümunələrini öyrənməyə davam edəcəyik. Bu mühazirədə biz Fabrik haqqında danışacağıq. Bu şablondan istifadə etməklə hansı problemin həll olunduğunu sizinlə müzakirə edəcəyik və fabrikin qəhvəxana açmağa necə kömək etdiyinə dair nümunəyə baxacağıq. Mən də sizə fabrik yaratmaq üçün 5 sadə addım verəcəyəm. Hamı ilə eyni səhifədə olmaq və mahiyyəti asanlıqla qavramaq üçün aşağıdakı mövzularla tanış olmalısınız:
- Java-da miras
- Java-da istinad növlərinin daralması və genişləndirilməsi
- Müxtəlif siniflər və obyektlər arasında qarşılıqlı əlaqə
Fabrika nədir?
Zavod dizayn nümunəsi obyektlərin yaradılmasına nəzarət etməyə imkan verir. Yeni obyektin yaradılması prosesi o qədər də sadə deyil, lakin o qədər də mürəkkəb deyil. Hamımız bilirik ki, yeni bir obyekt yaratmaq üçünnew
. Və görünə bilər ki, burada idarə olunacaq bir şey yoxdur, amma bu belə deyil. Tətbiqimizdə çoxlu nəsli olan müəyyən bir sinif olduqda çətinliklər yarana bilər və bəzi şərtlərdən asılı olaraq müəyyən bir sinfin nümunəsini yaratmaq lazımdır. Fabrika bəzi şərtlərdən asılı olaraq müxtəlif obyektlərin yaradılması problemini həll etməyə kömək edən dizayn nümunəsidir. Abstrakt, elə deyilmi? Aşağıdakı nümunəyə baxdıqda daha konkretlik və aydınlıq görünəcək.
Fərqli qəhvə növləri yaradırıq
Tutaq ki, biz bir qəhvəxananı avtomatlaşdırmaq istəyirik. Müxtəlif növ qəhvə hazırlamağı öyrənməliyik. Bunun üçün tətbiqimizdə qəhvə sinfi və onun törəmələri yaradacağıq: Americano, kapuçino, espresso, latte - hazırlayacağımız qəhvə növləri. Ümumi qəhvə sinifindən başlayaq:public class Coffee {
public void grindCoffee(){
// перемалываем кофе
}
public void makeCoffee(){
// делаем кофе
}
public void pourIntoCup(){
// наливаем в чашку
}
}
Sonra onun varislərini yaradaq:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Müştərilərimiz bir növ qəhvə sifariş edəcəklər və bu məlumat proqrama ötürülməlidir. Bu, müxtəlif yollarla edilə bilər, məsələn, istifadə edərək String
. Ancaq bu məqsədlər üçün ən uyğundur enum
. enum
Gəlin sifariş qəbul etdiyimiz qəhvə növlərini yaradaq və müəyyən edək:
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
Əla, indi qəhvəxanamızın kodunu yazaq:
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;
}
}
Metod orderCoffee
iki komponentə bölünə bilər:
- Blokda xüsusi qəhvə nümunəsinin yaradılması
switch-case
. Burada Fabrikin gördüyü iş şəraitdən asılı olaraq spesifik bir növün yaradılmasıdır. - Hazırlığın özü üyüdülür, bişirilir və bir fincana tökülür.
- Hazırlıq alqoritminin özü (üyüdülməsi, bişirilməsi və bir fincana tökülməsi) dəyişməz qalacaq (ən azı buna ümid edirik).
- Ancaq qəhvə çeşidi dəyişə bilər. Bəlkə moça hazırlamağa başlayaq.. Moça.. Mokkaçi... Allah rəhmət eləsin, yeni növ qəhvə.
switch-case
. O da mümkündür ki, bizim qəhvəxanamızda üsul orderCoffee
müxtəlif növ qəhvələr hazırladığımız yeganə yer olmayacaq. Ona görə də bir neçə yerdə dəyişiklik edilməli olacaq. Yəqin ki, siz mənim nəyə nail olduğumu artıq başa düşürsünüz. Biz refaktor etməliyik. Qəhvə yaratmaq üçün məsul olan bloku iki səbəbə görə ayrı bir sinifə köçürün:
- Biz başqa yerlərdə qəhvə yaratmaq məntiqindən yenidən istifadə edə biləcəyik.
- Əgər diapazon dəyişirsə, biz kofenin yaradılmasının istifadə olunacağı hər yerdə kodu redaktə etmək məcburiyyətində qalmayacağıq. Kodu yalnız bir yerdə dəyişdirmək kifayətdir.
İlk fabrikimizi mişar edirik
Bunu etmək üçün, yalnız qəhvə siniflərinin lazımi nümunələrinin yaradılmasına cavabdeh olacaq yeni bir sinif yaradaq: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;
}
}
Təbrik edirik! Biz indicə Fabrika dizayn modelini ən sadə formada tətbiq etdik. Baxmayaraq ki, metod statik edilsəydi, hər şey daha sadə ola bilərdi createCoffee
. Lakin o zaman biz iki imkanı itirmiş olarıq:
- -dən miras alın
SimpleCoffeeFactory
və onu ləğv edincreateCoffee
. - Dərslərimizdə tələb olunan zavod tətbiqini həyata keçirin.
Bir fabrikin qəhvəxanaya daxil edilməsi
Gəlin bir fabrikdən istifadə edərək qəhvəxana sinifimizi yenidən yazaq: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;
}
}
Əla. İndi Fabrika dizayn nümunəsinin strukturunu sxematik və qısa şəkildə təsvir etməyə çalışaq.
Öz fabrikinizi açmaq üçün 5 addım
Addım 1. Proqramınızda aşağıdakı şəkildə olduğu kimi bir neçə nəsli olan sinifiniz var: Addım 2. Siz hər bir nəsil sinfi üçün enum dəyişənini təyin etdiyiniz sinif yaradırsınız :enum
enum CatType {
LION,
TIGER,
BARSIK
}
Addım 3. Siz öz fabrikinizi qurursunuz. Siz onu çağırırsınız MyClassFactory
, kod aşağıdadır:
class CatFactory {}
Addım 4. Siz fabrikinizdə createMyClass
- dəyişənini götürən bir üsul yaradırsınız enum
MyClassType
. Aşağıdakı kod:
class CatFactory {
public Cat createCat(CatType type) {
}
}
Addım 5. Bütün enum dəyərləri arasında təkrarladığınız metodun gövdəsinə blok yazır və dəyərə switch-case
uyğun sinif nümunəsini yaradırsınız :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;
}
}
Patron kimi.
GO TO FULL VERSION