JavaRush /Java blogi /Random-UZ /Zavod dizayni namunasi

Zavod dizayni namunasi

Guruhda nashr etilgan
Salom do'st! Bugun biz siz bilan dizayn naqshlarini o'rganishni davom ettiramiz. Ushbu ma'ruzada biz Fabrika haqida gapiramiz. Biz siz bilan ushbu shablon yordamida qanday muammoni hal qilishini muhokama qilamiz va zavod qahvaxona ochishga qanday yordam berishi haqidagi misolni ko'rib chiqamiz. Va men sizga zavod yaratish uchun 5 oddiy qadamni ham beraman. Zavod dizayni namunasi - 1Hamma bilan bir sahifada bo'lish va mohiyatni osongina tushunish uchun siz quyidagi mavzular bilan tanishishingiz kerak:
  • Java-da meros
  • Java tilidagi mos yozuvlar turlarini toraytirish va kengaytirish
  • Turli sinflar va ob'ektlarning o'zaro ta'siri

Zavod nima?

Zavod dizayni namunasi ob'ektlarni yaratishni boshqarish imkonini beradi. Yangi ob'ektni yaratish jarayoni unchalik oddiy emas, lekin u ham juda murakkab emas. Biz hammamiz bilamizki, yangi ob'ekt yaratish uchun new. Va bu erda boshqaradigan hech narsa yo'qdek tuyulishi mumkin, ammo bu unday emas. Bizning ilovamiz ko'p avlodlarga ega bo'lgan ma'lum bir sinfga ega bo'lsa va ba'zi shartlarga qarab ma'lum bir sinfning namunasini yaratish kerak bo'lganda qiyinchiliklar paydo bo'lishi mumkin. Zavod - bu ba'zi sharoitlarga qarab turli xil ob'ektlarni yaratish muammosini hal qilishga yordam beradigan dizayn naqshidir. Abstrakt, shunday emasmi? Quyidagi misolni ko'rib chiqsak, yanada aniqlik va aniqlik paydo bo'ladi.

Biz turli xil qahva turlarini yaratamiz

Aytaylik, biz qahvaxonani avtomatlashtirmoqchimiz. Biz har xil turdagi qahva tayyorlashni o'rganishimiz kerak. Buning uchun ilovamizda kofe sinfini va uning hosilalarini yaratamiz: Americano, kapuchino, espresso, latte - biz tayyorlaydigan qahva turlari. Umumiy kofe sinfidan boshlaylik:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
Keling, uning merosxo'rlarini yarataylik:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Bizning mijozlarimiz qahvaning bir turiga buyurtma berishadi va bu ma'lumot dasturga o'tkazilishi kerak. Bu turli yo'llar bilan amalga oshirilishi mumkin, masalan, yordamida String. Lekin bu maqsadlar uchun eng mos keladi enum. Keling, enumbiz buyurtma qabul qiladigan qahva turlarini yaratamiz va aniqlaymiz:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Ajoyib, endi qahvaxonamiz kodini yozamiz:
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;
    }
}
Usulni orderCoffeeikki qismga bo'lish mumkin:
  1. Blokda ma'lum bir qahva namunasini yaratish switch-case. Bu erda zavod nima qiladi, sharoitga qarab o'ziga xos turni yaratish.
  2. Tayyorgarlikning o'zi maydalash, pishirish va chashka ichiga quyiladi.
Kelajakda usulga o'zgartirishlar kiritishingiz kerak bo'lsa, nimani bilish muhim:
  1. Tayyorgarlik algoritmining o'zi (maydalash, pishirish va stakanga quyish) o'zgarishsiz qoladi (hech bo'lmaganda umid qilamiz).
  2. Ammo qahvaning assortimenti o'zgarishi mumkin. Balki mocha tayyorlashni boshlarmiz.. Mocha.. Mokkachi... Xudo uni asrasin, yangi turdagi kofe.
Biz allaqachon taxmin qilishimiz mumkinki, kelajakda ma'lum bir ehtimollik darajasi bilan biz usulga, blokga o'zgartirishlar kiritishimiz kerak bo'ladi switch-case. Bundan tashqari, bizning qahvaxonamizda bu usul orderCoffeebiz turli xil qahva turlarini yaratadigan yagona joy bo'lmasligi mumkin. Shuning uchun, bir necha joylarda o'zgarishlar qilish kerak bo'ladi. Siz nimaga erishayotganimni allaqachon tushungandirsiz. Biz qayta tiklashimiz kerak. Ikki sababga ko'ra qahva yaratish uchun mas'ul bo'lgan blokni alohida sinfga o'tkazing:
  1. Biz qahva yaratish mantiqini boshqa joylarda qayta ishlatishimiz mumkin bo'ladi.
  2. Agar diapazon o'zgarsa, biz qahva yaratish ishlatiladigan hamma joyda kodni tahrirlashimiz shart emas. Kodni faqat bitta joyda o'zgartirish kifoya qiladi.
Boshqacha aytganda, zavodni qisqartirish vaqti keldi.

Biz birinchi zavodimizni arralayapmiz

Buni amalga oshirish uchun keling, faqat kofe sinflarining kerakli nusxalarini yaratish uchun javobgar bo'lgan yangi sinf yarataylik:
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;
    }
}
Seni tabriklayman! Biz hozirgina zavod dizayni namunasini eng oddiy shaklda joriy qildik. Garchi usul createCoffeestatik qilingan bo'lsa, hamma narsa yanada sodda bo'lishi mumkin edi. Ammo keyin biz ikkita imkoniyatni yo'qotamiz:
  1. dan meros olish SimpleCoffeeFactoryva uni bekor qilish createCoffee.
  2. Sinflarimizda talab qilinadigan zavod amaliyotini amalga oshiring.
Amalga oshirish haqida gapirganda. Biz qahvaxonaga qaytib, kofe ishlab chiqarish zavodimizni amalga oshirishimiz kerak.

Fabrikaning qahvaxonaga kiritilishi

Keling, qahvaxona sinfimizni zavod yordamida qayta yozamiz:
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;
    }
}
Ajoyib. Keling, zavod dizayni naqshining tuzilishini sxematik va qisqacha tasvirlashga harakat qilaylik.

O'z fabrikangizni ochish uchun 5 qadam

1-qadam. Quyidagi rasmda bo'lgani kabi dasturingizda bir nechta avlodlari bo'lgan sinf mavjud: 2-qadam. Siz har bir avlod sinfi uchun enum o'zgaruvchisini aniqlaydigan Zavod dizayni namunasi - 2sinf yaratasiz :enum
enum CatType {
    LION,
    TIGER,
    BARSIK
}
3-qadam. Siz fabrikangizni qurasiz. Siz uni chaqirasiz MyClassFactory, kod quyida:
class CatFactory {}
Qadam 4. Siz o'z zavodingizda createMyClass- o'zgaruvchisini qabul qiladigan usul yaratasiz enum MyClassType. Quyidagi kod:
class CatFactory {
    public Cat createCat(CatType type) {

    }
}
5-qadam. Siz barcha enum qiymatlari orqali takrorlanadigan usulning tanasiga blok yozasiz va qiymatga switch-casemos keladigan sinf namunasini yaratasiz :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;
        }
    }
Xo'jayin kabi.

Qanday mashq qilish kerak

O'qish yaxshi, kod yozish undan ham yaxshiroq. Agar ismingiz juft sonli harflardan iborat bo'lsa, o'zingizning virtual pitseriyangizni yaratishga harakat qiling. Agar ismingiz toq sonli harflardan iborat bo'lsa, virtual sushi barini yaratishga harakat qiling. Agar siz anonim bo'lsangiz, omadingiz bor. Bugun siz dam olishingiz mumkin.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION