Salam, dost! Bu gün siziň bilen dizaýn nagyşlaryny öwrenmegi dowam etdireris. Bu leksiýada zawod hakda gürleşeris. Bu şablony ulanmak bilen haýsy meseläniň çözüljekdigini ara alyp maslahatlaşarys we zawodyň kofe dükanyny açmagyna nähili kömek edýändigine serederis. Zawod döretmek üçin size 5 sany ýönekeý ädim hem bererin. Hemmeler bilen bir sahypada bolmak we manysyna aňsatlyk bilen düşünmek üçin aşakdaky temalar bilen tanyş bolmaly:
- Java-da miras
- Java-da salgylanma görnüşlerini daraltmak we giňeltmek
- Dürli synplaryň we obýektleriň özara täsiri
Zawod näme?
Zawodyň dizaýn nagşy, obýektleriň döredilmegine gözegçilik etmäge mümkinçilik berýär. Täze obýekt döretmek prosesi beýle bir ýönekeý däl, ýöne gaty çylşyrymly däl. Täze bir obýekt döretmek üçin ulanmalydygymyzy hemmämiz bilýärisnew
. Bu ýerde dolandyryp boljak zat ýok ýaly bolup görünýär, ýöne beýle däl. Programmamyzda köp nesli bolan belli bir synp bar bolsa, käbir şertlere baglylykda belli bir synpyň mysalyny döretmeli bolanda kynçylyklar ýüze çykyp biler. Zawod , käbir şertlere baglylykda dürli obýektleri döretmek meselesini çözmäge kömek edýän dizaýn nagşydyr. Abstrakt, şeýlemi? Aşakdaky mysala seredenimizde has anyklyk we aýdyňlyk peýda bolar.
Dürli kofe döredýäris
Kofe dükanyny awtomatlaşdyrmak isleýäris diýeliň. Dürli kofe taýýarlamagy öwrenmeli. Munuň üçin programmamyzda kofe synpyny we olardan emele gelenleri dörederis: Amerikanano, kapuçino, espresso, latte - taýýarlan kofeniň görnüşleri. Umumy kofe synpyndan başlalyň:public class Coffee {
public void grindCoffee(){
// перемалываем кофе
}
public void makeCoffee(){
// делаем кофе
}
public void pourIntoCup(){
// наливаем в чашку
}
}
Geliň, mirasçylaryny döredeliň:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Müşderilerimiz kofe görnüşine sargyt ederler we bu maglumatlary programma geçirmeli. Bu dürli usullar bilen, mysal üçin ulanmak arkaly edilip bilner String
. Emma bu maksatlar üçin iň amatlysydyr enum
. Geliň, enum
onda sargytlary kabul edýän kofe görnüşlerini döredeliň we kesgitläliň:
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
Gowy, indi kofe dükanymyz üçin kod ýazalyň:
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;
}
}
Usuly orderCoffee
iki bölege bölmek bolar:
- Bir blokda belli bir kofe mysalyny döretmek
switch-case
. Zawodyň edýän ýeri, şertlere baglylykda belli bir görnüşi döretmekdir. - Taýýarlygyň özi üwürmek, bişirmek we bir käse guýmak.
- Taýýarlyk algoritminiň özi (üwemek, bişirmek we bir käse guýmak) üýtgemez (iň bolmanda şeýle bolar diýip umyt edýäris).
- Emma kofeniň görnüşi üýtgäp biler. Belki, moça ýasap başlarys .. Moça .. Mokkaçi ... Hudaý ýalkasyn, täze kofe.
switch-case
. Şeýle hem, kofe dükanymyzda bu usulyň orderCoffee
dürli görnüşli kofe döredýän ýeke-täk ýerimiz bolmazlygy mümkindir. Şonuň üçin birnäçe ýerde üýtgeşmeler girizilmeli. Meniň näme alýandygyma eýýäm düşünersiňiz. Reaktor etmeli. Kofe döretmek üçin jogapkär bloky iki sebäbe görä aýratyn klasa geçiriň:
- Başga ýerlerde kofe döretmek logikasyny gaýtadan ulanyp bileris.
- Aralyk üýtgese, kofe döretmek üçin ulanylýan hemme ýerde kod redaktirlemeli bolmaz. Kody diňe bir ýerde üýtgetmek ýeterlik bolar.
Ilkinji zawodymyzy görýäris
Munuň üçin diňe kofe sapaklarynyň zerur mysallaryny döretmek üçin jogapkär boljak täze synp döredeliň: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;
}
}
Gutlaýarys! Zawodyň dizaýn nusgasyny iň ýönekeý görnüşinde durmuşa geçirdik. Usul statik edilse hemme zat has ýönekeý bolup bilerdi createCoffee
. Emma soň iki mümkinçiligi ýitireris:
- Ondan miras alyň
SimpleCoffeeFactory
we ýok ediňcreateCoffee
. - Zawodyň zerur ýerine ýetirilişini synplarymyzda ýerine ýetiriň.
Zawodyň kofe dükanyna ornaşdyrylmagy
Zawod ulanyp, kofe dükanymyzyň synpyny täzeden ýazalyň: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;
}
}
Gowy. Indi Zawodyň dizaýn nagşynyň gurluşyny shematiki we gysgaça suratlandyrmaga synanyşalyň.
Zawodyňyzy açmak üçin 5 ädim
Stepdim 1. Programmaňyzda aşakdaky suratdaky ýaly birnäçe nesil bilen synpyňyz bar: 2-nji ädim . Her nesil synpy üçin san üýtgeýänini kesgitleýän synp döredýärsiňiz :enum
enum CatType {
LION,
TIGER,
BARSIK
}
Stepdim 3. Zawodyňyzy gurýarsyňyz. Oňa jaň edýärsiňiz MyClassFactory
, kod aşakda:
class CatFactory {}
Stepdim 4. Zawodyňyzda createMyClass
üýtgeýjini alýan usul döredýärsiňiz - enum
MyClassType
. Aşakdaky kod:
class CatFactory {
public Cat createCat(CatType type) {
}
}
5-nji ädim. Enhli bahalary gaýtalap, bahanyň switch-case
gabat gelýän synpyny döredýän usulyň mazmunyna bir blok ýazýarsyňyz :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;
}
}
Başlyk ýaly.
GO TO FULL VERSION