Салам дос! Бүгүн биз сиздер менен дизайн үлгүлөрүн изилдөөнү улантабыз. Бул лекцияда биз Фабрика жөнүндө сөз кылабыз. Биз сиз менен бул шаблон аркылуу кандай көйгөй чечилерин талкуулайбыз жана фабрика кофе дүкөнүн ачууга кандайча жардам бергенин мисалга келтиребиз. Ошондой эле мен сизге фабрика түзүү үчүн 5 жөнөкөй кадамдарды берем. Баары менен бир бетте болуу жана маңызын оңой түшүнүү үчүн, сиз төмөнкү темалар менен тааныш болушуңуз керек:
- Javaдагы мурас
- Java тorндеги маалымдама түрлөрүн кыскартуу жана кеңейтүү
- Ар кандай класстардын жана an objectтердин өз ара аракеттенүүсү
Фабрика деген эмне?
Фабрика дизайн үлгүсү an objectилерди түзүүнү башкарууга мүмкүндүк берет. Жаңы an objectти түзүү процесси анчалык деле жөнөкөй эмес, бирок өтө татаал да эмес. Жаңы an objectти түзүү үчүн бизnew
. Бул жерде башкара турган эч нерсе жоктой сезorши мүмкүн, бирок андай эмес. Биздин тиркемеде көптөгөн тукумдары бар белгилүү бир класс болгондо кыйынчылыктар пайда болушу мүмкүн жана кээ бир шарттарга жараша белгилүү бир класстын үлгүсүн түзүү зарыл. Фабрика - бул кандайдыр бир шарттарга жараша ар кандай an objectтерди түзүү маселесин чечүүгө жардам берген дизайн үлгүсү. Абстракттуу, туурабы? Төмөндөгү мисалды караганыбызда көбүрөөк конкреттүүлүк жана айкындык пайда болот.
Биз кофенин ар кандай түрлөрүн жасайбыз
Биз кофе дүкөнүн автоматташтыргыбыз келет дейли. Биз кофенин ар кандай түрлөрүн жасаганды үйрөнүшүбүз керек. Бул үчүн, биздин тиркемеде биз кофе классын жана анын туундуларын түзөбүз: Americano, капучино, эспрессо, латте - биз даярдай турган кофенин түрлөрү. Жалпы кофе классынан баштайлы: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-кадам. Методдун корпусуна блок жазасыз, анда сиз бардык enum маанилери аркылуу кайталап, мааниге 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