Сәлем дос! Бүгін біз сіздермен дизайн үлгілерін зерттеуді жалғастырамыз. Бұл лекцияда біз Фабрика туралы айтатын боламыз. Біз сіздермен осы үлгіні пайдаланып қандай мәселе шешілетінін талқылаймыз және фабриканың кофехана ашуға қалай көмектесетінінің мысалын қарастырамыз. Мен сізге зауыт құрудың 5 қарапайым қадамын беремін. Барлығымен бір бетте болу және оның мәнін оңай түсіну үшін келесі тақырыптармен таныс болуыңыз керек:
- Java тіліндегі мұра
- Java тіліндегі сілтеме түрлерін тарылту және кеңейту
- Әртүрлі класстар мен an objectілердің өзара әрекеттесуі
Зауыт дегеніміз не?
Зауыттық дизайн үлгісі нысандарды құруды басқаруға мүмкіндік береді. Жаңа нысанды жасау процесі соншалықты қарапайым емес, бірақ тым күрделі де емес. Жаңа нысан жасау үшін пайдалану керек екенін бәріміз білемізnew
. Бұл жерде басқаруға ештеңе жоқ сияқты көрінуі мүмкін, бірақ олай емес. Біздің қолданбада көптеген ұрпақтары бар белгілі бір класс болған кезде қиындықтар туындауы мүмкін және кейбір шарттарға байланысты белгілі бір сыныптың данасын жасау қажет. Зауыт - бұл кейбір шарттарға байланысты әртүрлі an objectілерді құру мәселесін шешуге көмектесетін дизайн үлгісі. Аннотация, солай емес пе? Төмендегі мысалды қараған кезде нақтылық пен айқындық пайда болады.
Біз кофенің әртүрлі түрлерін жасаймыз
Біз кофехананы автоматтандырғымыз келеді делік. Біз кофенің әртүрлі түрлерін дайындауды үйренуіміз керек. Ол үшін біздің қосымшамызда кофе класын және оның туындыларын жасаймыз: американо, капучино, эспрессо, латте - біз дайындайтын кофе түрлері. Жалпы кофе класынан бастайық: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
екі компонентке бөлуге болады:
- Блокта белгілі бір кофе данасын жасау
switch-case
. Бұл жерде Зауыт шартқа байланысты белгілі бір түрін жасайды. - Дайындықтың өзі ұнтақтау, пісіру және кесеге құю.
- Дайындау алгоритмінің өзі (ұнтақтау, пісіру және кесеге құю) өзгеріссіз қалады (кем дегенде біз солай деп үміттенеміз).
- Бірақ кофе ассортименті өзгеруі мүмкін. Бәлкім, моча.. Моча.. Моккачи жасай бастаймыз... Құдай жарылқасын, кофенің жаңа түрі.
switch-case
. orderCoffee
Біздің кофеханада бұл әдіс кофенің әртүрлі түрлерін жасайтын жалғыз орын болмауы мүмкін . Сондықтан бірнеше жерде өзгерістер енгізуге тура келеді. Сіз менің немен айналысып жатқанымды түсінген шығарсыз. Бізге рефактор керек. Кофе жасауға жауапты блокты екі себеп бойынша бөлек сыныпқа жылжытыңыз:
- Біз кофе жасау логикасын басқа жерлерде қайта пайдалана аламыз.
- Егер ауқым өзгерсе, кофе жасау қолданылатын барлық жерде 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
статикалық болса, бәрі оңайырақ болуы мүмкін. Бірақ ол кезде біз екі мүмкіндікті жоғалтамыз:
- мұрағат алу
SimpleCoffeeFactory
және қайта анықтауcreateCoffee
. - Біздің сабақтарда қажетті зауыттық енгізуді енгізіңіз.
Фабриканы кофеханаға енгізу
Фабрика арқылы кофехана класын қайта жазайық: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 айнымалы мәнін анықтайтын класс жасайсыз :enum
enum CatType {
LION,
TIGER,
BARSIK
}
3-қадам. Сіз өз зауытыңызды саласыз. Сіз оны шақырасыз MyClassFactory
, code төменде:
class CatFactory {}
4-қадам. Сіз зауытта createMyClass
- айнымалысын қабылдайтын әдісті жасайсыз enum
MyClassType
. Төмендегі code:
class CatFactory {
public Cat createCat(CatType type) {
}
}
5-қадам. Сіз барлық санау мәндері арқылы қайталанатын әдістің негізгі бөлігіне блок жазасыз және мәнге 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;
}
}
Бастық сияқты.
GO TO FULL VERSION