CodeGym /Blog Java /rawak /Corak reka bentuk kilang
John Squirrels
Tahap
San Francisco

Corak reka bentuk kilang

Diterbitkan dalam kumpulan
Hai kawan! Hari ini kita akan terus mengkaji corak reka bentuk. Dalam pelajaran ini, kita akan bercakap tentang kilang. Kami akan membincangkan masalah yang diselesaikan oleh corak ini dan melihat contoh bagaimana sebuah kilang boleh membantu anda membuka kedai kopi. Selain itu, saya akan memberi anda 5 langkah mudah untuk membuat kilang. Corak reka bentuk kilang - 1 Untuk memastikan bahawa kita semua berada pada panjang gelombang yang sama dan anda akan cepat memahami konsep ini, anda harus biasa dengan topik berikut:
  • Warisan di Jawa
  • Menyempitkan dan meluaskan jenis rujukan di Jawa
  • Interaksi antara kelas dan objek yang berbeza.

Apa itu kilang?

Corak reka bentuk kilang membolehkan anda mengawal penciptaan objek. Proses mencipta objek baharu bukanlah sangat mudah, tetapi ia juga tidak terlalu rumit. Kita semua tahu bahawa kita memerlukan newpengendali untuk mencipta objek baharu. Mungkin nampaknya tiada apa yang boleh dikawal di sini, tetapi itu tidak benar. Katakan permohonan kita mempunyai kelas tertentu yang mempunyai banyak keturunan. Kesukaran boleh timbul apabila perlu untuk mencipta contoh kelas tertentu bergantung pada syarat tertentu. Kilang adalah corak reka bentuk yang membantu menyelesaikan masalah mencipta pelbagai objek bergantung pada keadaan tertentu . Bagaimana itu untuk konsep abstrak? Ini akan menjadi lebih jelas dan lebih spesifik apabila kita melihat contoh di bawah.

Jom sediakan pelbagai jenis kopi

Katakan kita mahu mengautomasikan kedai kopi. Kami perlu mengajar program kami cara membuat pelbagai jenis kopi. Untuk melakukan ini, kami akan membuat kelas kopi dan beberapa kelas terbitan untuk mewakili jenis kopi yang akan kami sediakan: Americano, cappuccino, espresso dan latte. Mari kita mulakan dengan kelas kopi umum:

public class Coffee {
    public void grindCoffee(){
        // Grind the coffee
    }
    public void makeCoffee(){
        // Brew the coffee
    }
    public void pourIntoCup(){
        // Pour into a cup
    }
}
Seterusnya, kami akan mencipta kelas anaknya:

public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Pelanggan kami boleh memesan apa-apa jenis kopi. Pesanan mereka perlu dihantar ke program. Ini boleh dilakukan dalam pelbagai cara, contohnya, menggunakan String. Tetapi enumadalah yang terbaik untuk ini. Kami akan mencipta enumdan menentukan medan enum yang sepadan dengan jenis kopi yang boleh dipesan:

public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Hebat. 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("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
Kaedah orderCoffeeboleh dibahagikan kepada dua bahagian:
  1. Penciptaan contoh kopi tertentu dalam switchpernyataan. Di sinilah kilang melakukan apa yang dilakukannya — mencipta jenis tertentu bergantung pada keadaan.
  2. Penyediaan - ini adalah mengisar, membancuh, dan menuang ke dalam cawan.
Berikut ialah perkara penting untuk diketahui jika anda perlu membuat perubahan pada kaedah pada masa hadapan:
  1. Langkah-langkah yang terlibat dalam penyediaan itu sendiri (mengisar, membancuh, dan menuang ke dalam cawan) akan kekal tidak berubah (sekurang-kurangnya kita mengharapkan ini).
  2. Tetapi pelbagai jenis kopi mungkin berubah. Mungkin kita akan mula membuat mocha... Frappu... Mochacci... Apa pun, jenis kopi baharu.
Kita sudah boleh agak yakin bahawa pada masa hadapan kita perlu membuat perubahan pada switchkenyataan kaedah. Mungkin juga di kedai kopi kami orderCoffeekaedah itu bukan satu-satunya tempat di mana kami akan mencipta pelbagai jenis kopi. Akibatnya, 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. Kita boleh menggunakan semula logik membuat kopi di tempat lain.
  2. Jika pelbagai berubah, kami tidak perlu mengedit kod di mana-mana kopi dibuat. Ia akan mencukupi untuk menukar kod kami di satu tempat sahaja.
Dalam erti kata lain, sudah tiba masanya untuk menubuhkan kilang.

Menubuhkan kilang pertama kami

Untuk melakukan ini, kami akan mencipta kelas baharu yang hanya akan bertanggungjawab 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 (hampir). Ia mungkin lebih mudah jika kita membuat createCoffeekaedah statik. Tetapi kemudian kita akan kehilangan dua keupayaan:
  1. Keupayaan untuk mewarisi SimpleCoffeeFactorydan mengatasi createCoffeekaedah.
  2. Keupayaan untuk menambah pelaksanaan kilang yang diperlukan pada kelas kami.
By the way, bercakap tentang pelaksanaan... Kita perlu kembali ke kedai kopi dan menambah kilang membuat kopi kita.

Menambah kilang ke kedai kopi

Mari kita tulis semula kelas kedai kopi 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("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
Cemerlang. Sekarang kami akan memberikan penerangan ringkas tentang struktur umum corak reka bentuk kilang.

5 langkah membuka kilang sendiri

Langkah 1. Program anda mempunyai kelas dengan beberapa keturunan, seperti dalam rajah di bawah: Corak reka bentuk kilang - 2Langkah 2. Anda mencipta enummedan dengan setiap kelas kanak-kanak:

    enum CatType {
        LION,
        TIGER,
        FLUFFY
    }
Langkah 3. Bina kilang anda. Sebut saja CatFactory. Inilah kodnya:

class CatFactory {}
Langkah 4. Di kilang anda, buat createCatkaedah yang memerlukan CatTypehujah. Inilah kodnya:

    class CatFactory {
        public Cat createCat(CatType type) {
            
        }
    }
Langkah 5. Dalam kandungan kaedah, tulis switchpernyataan yang menghitung medan enum dan cipta contoh kelas yang sepadan dengan enumnilai yang diluluskan:

class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;
            
            switch (type) {
                case LION:
                    cat =  new Fluffy();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case FLUFFY:
                    cat =  new Lion();
                    break;
            }
            
            return cat;
        }
    }
Sekarang anda boleh menjalankan kilang seperti bos. :)

Cara berlatih

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 tidak mempunyai nama, anda bertuah. Hari ini anda boleh berehat.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION