Салом, дуст! Имрӯз мо омӯзиши намунаҳои тарроҳиро бо шумо идома медиҳем. Дар ин лекция мо дар бораи Фабрика сухан меронем. Мо бо шумо муҳокима хоҳем кард, ки бо истифода аз ин қолаб кадом мушкилот ҳал карда мешавад ва ба мисоли он, ки чӣ гуна корхона дар кушодани қаҳвахона кӯмак мекунад, бубинем. Ва ман инчунин ба шумо 5 қадами оддиро барои сохтани як корхона медиҳам. Барои он ки бо ҳама дар як саҳифа бошед ва моҳиятро ба осонӣ дарк кунед, шумо бояд бо мавзӯъҳои зерин ошно бошед:
- Мерос дар Java
- Маҳдуд ва васеъ кардани намудҳои истинод дар Java
- Муносибати байни синфҳо ва an objectҳои гуногун
Фабрика чист?
Намунаи тарроҳии завод ба шумо имкон медиҳад, ки эҷоди an objectҳоро назорат кунед. Раванди эҷоди an objectи нав он қадар оддӣ нест, аммо он ҳам мураккаб нест. Мо ҳама медонем, ки барои сохтани an objectи нав мо боядnew
. Ва шояд ба назар чунин мерасад, ки дар ин ҷо ҳеҷ чиз идора карда намешавад, аммо ин тавр нест. Вақте ки барномаи мо дорои синфи муайяне, ки наслҳои зиёд дорад, душвориҳо ба миён омада метавонанд ва вобаста ба баъзе шароитҳо намунаи синфи муайянро эҷод кардан лозим аст. Фабрика як намунаи тарроҳӣ мебошад, ки ба ҳалли масъалаи эҷоди 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;
}
}
Табрик мекунем! Мо наваHow намунаи тарҳрезии Фабрикаро дар шакли соддатаринаш амалӣ кардем. Ҳарчанд ҳама чиз метавонад боз ҳам соддатар бошад, агар ин усул статикӣ бошад 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
. Рамзи дар поён:
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