JavaRush /Blog Java /Random-MS /Corak reka bentuk kilang

Corak reka bentuk kilang

Diterbitkan dalam kumpulan
Hai kawan! Hari ini kami akan terus mengkaji corak reka bentuk dengan anda. Dalam kuliah ini kita akan bercakap tentang Kilang. Kami akan berbincang dengan anda tentang masalah yang diselesaikan menggunakan templat ini, dan lihat contoh cara kilang membantu membuka kedai kopi. Dan saya juga akan memberikan anda 5 langkah mudah untuk membuat kilang. Corak Reka Bentuk Kilang - 1Untuk berada di halaman yang sama dengan semua orang dan mudah memahami intipati, anda harus biasa dengan topik berikut:
  • Warisan di Jawa
  • Mengecilkan dan mengembangkan jenis rujukan dalam Java
  • Interaksi antara kelas dan objek yang berbeza

Apa itu Kilang?

Corak reka bentuk Kilang membolehkan anda mengawal penciptaan objek. Proses mencipta objek baharu tidak semudah itu, tetapi ia juga tidak terlalu rumit. Kita semua tahu bahawa untuk mencipta objek baru kita mesti menggunakan new. Dan nampaknya tiada apa yang perlu diuruskan di sini, tetapi ini tidak begitu. Kesukaran mungkin timbul apabila aplikasi kita mempunyai kelas tertentu yang mempunyai banyak keturunan, dan adalah perlu untuk mencipta contoh kelas tertentu bergantung pada beberapa syarat. Kilang ialah corak reka bentuk yang membantu menyelesaikan masalah mencipta objek berbeza bergantung pada beberapa keadaan. Abstrak, bukan? Lebih kekhususan dan kejelasan akan muncul apabila kita melihat contoh di bawah.

Kami mencipta pelbagai jenis kopi

Katakan kita mahu mengautomasikan kedai kopi. Kita perlu belajar cara menyediakan pelbagai jenis kopi. Untuk melakukan ini, dalam aplikasi kami, kami akan mencipta kelas kopi dan derivatifnya: Americano, cappuccino, espresso, latte - jenis kopi yang akan kami sediakan. Mari kita mulakan dengan kelas kopi umum:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
Seterusnya, mari kita cipta pewarisnya:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Pelanggan kami akan memesan beberapa jenis kopi, dan maklumat ini perlu dihantar kepada program. Ini boleh dilakukan dengan cara yang berbeza, contohnya menggunakan String. Tetapi ia paling sesuai untuk tujuan ini enum. Mari kita cipta enumdan tentukan di dalamnya jenis kopi yang kami terima tempahan:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Bagus, sekarang mari tulis kod untuk kedai kopi kami:
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;
    }
}
Kaedah orderCoffeeboleh dibahagikan kepada dua komponen:
  1. Mencipta contoh kopi tertentu dalam blok switch-case. Di sinilah apa yang Kilang lakukan adalah penciptaan jenis tertentu bergantung pada syarat.
  2. Penyediaan itu sendiri adalah mengisar, memasak dan menuang ke dalam cawan.
Apa yang penting untuk diketahui jika anda perlu membuat perubahan pada kaedah pada masa hadapan:
  1. Algoritma penyediaan itu sendiri (mengisar, memasak dan menuang ke dalam cawan) akan kekal tidak berubah (sekurang-kurangnya kami berharap begitu).
  2. Tetapi julat kopi mungkin berubah. Mungkin kita akan mula membuat mocha.. Mocha.. Mokkachi... Tuhan memberkati dia, jenis kopi baru.
Kita sudah boleh mengandaikan bahawa pada masa hadapan, dengan tahap kebarangkalian tertentu, kita perlu membuat perubahan pada kaedah, pada blok switch-case. Ia juga mungkin bahawa di kedai kopi kami kaedah itu orderCoffeebukan satu-satunya tempat di mana kami mencipta pelbagai jenis kopi. Oleh itu, perubahan perlu dibuat di beberapa tempat. Anda mungkin sudah faham apa yang saya maksudkan. Kita perlu memfaktorkan semula. Alihkan blok yang bertanggungjawab untuk mencipta kopi ke dalam kelas yang berasingan atas dua sebab:
  1. Kami akan dapat menggunakan semula logik mencipta kopi di tempat lain.
  2. Jika julat berubah, kami tidak perlu mengedit kod di mana-mana tempat penciptaan kopi akan digunakan. Ia akan mencukupi untuk menukar kod di satu tempat sahaja.
Dalam erti kata lain, sudah tiba masanya untuk memotong kilang.

Kami sedang menggergaji kilang pertama kami

Untuk melakukan ini, mari buat kelas baharu yang akan bertanggungjawab hanya untuk mencipta contoh kelas kopi yang diperlukan:
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;
    }
}
tahniah! Kami baru sahaja melaksanakan corak reka bentuk Kilang dalam bentuk yang paling mudah. Walaupun semuanya boleh menjadi lebih mudah jika kaedah itu dibuat createCoffeestatik. Tetapi kemudian kita akan kehilangan dua kemungkinan:
  1. Warisi daripada SimpleCoffeeFactorydan gantikan createCoffee.
  2. Laksanakan pelaksanaan kilang yang diperlukan dalam kelas kami.
Bercakap tentang pelaksanaan. Kami perlu kembali ke kedai kopi dan melaksanakan kilang membuat kopi kami.

Pengenalan kilang ke kedai kopi

Mari tulis semula kelas kedai kopi kami menggunakan kilang:
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;
    }
}
Hebat. Sekarang mari kita cuba menerangkan secara skematik dan padat struktur corak reka bentuk Kilang.

5 langkah membuka kilang sendiri

Langkah 1. Dalam program anda, anda mempunyai kelas dengan beberapa keturunan, seperti dalam gambar di bawah: Corak Reka Bentuk Kilang - 2Langkah 2. Anda mencipta kelas enumdi mana anda menentukan pembolehubah enum untuk setiap kelas keturunan:
enum CatType {
    LION,
    TIGER,
    BARSIK
}
Langkah 3. Anda membina kilang anda. Anda memanggilnya MyClassFactory, kod di bawah:
class CatFactory {}
Langkah 4. Anda mencipta kaedah di kilang anda createMyClassyang mengambil pembolehubah - enum MyClassType. Kod di bawah:
class CatFactory {
    public Cat createCat(CatType type) {

    }
}
Langkah 5. Anda menulis blok dalam badan kaedah switch-casedi mana anda melelar melalui semua nilai enum dan mencipta contoh kelas yang sepadan dengan enumnilai:
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;
        }
    }
Macam bos.

Bagaimana untuk melatih

Membaca adalah baik, menulis kod adalah lebih baik. Jika nama anda mempunyai bilangan huruf genap, cuba buat pizza maya anda sendiri. Jika nama anda mempunyai bilangan huruf yang ganjil, cuba buat bar sushi maya. Jika anda tanpa nama, anda bertuah. Hari ini anda boleh berehat.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION