cari

Rumah  >  Soal Jawab  >  teks badan

java - 抽象工厂模式支持什么样的业务背景

package GOF;

interface Create {

    public void create();
}

class A implements Create {

    @Override
    public void create() {
        System.out.println("A");
    }
}

class B implements Create {

    @Override
    public void create() {
        System.out.println("B");
    }
}

interface Produce {

    public Create produce();
}

class C implements Produce {

    @Override
    public Create produce() {
        return new A();
    }
}

class D implements Produce {

    @Override
    public Create produce() {
        return new B();
    }
}

public class AbstractFactory {

    public static void main(String[] args) {
        Produce produce = new C();
        Create create = produce.produce();
        create.create();
    }
}

如上图所示代码,是抽象工厂模式的实例。请问在实际的业务场景中如何使用?有什么优点。

黄舟黄舟2785 hari yang lalu704

membalas semua(1)saya akan balas

  • 大家讲道理

    大家讲道理2017-04-18 09:29:40

    Saya rasa soalan yang anda ajukan sangat bermakna. Ramai orang tidak boleh menggunakan corak reka bentuk secara fleksibel

    Izinkan saya bercakap tentang mengapa kita harus menggunakan corak reka bentuk kelas kilang dari perspektif menganalisis masalah

    Soalan 1: Kami selalunya mempunyai kelas dengan fungsi serupa dengan , jadi idea kami adalah untuk mengabstrakkannya, menggunakan antara muka untuk mendedahkan kaedah awam dan menggunakan kelas abstrak untuk memberikan kesedaran awam .

    public interface IProduct {
        void print(); // 这是要暴露的方法
    }
    
    public abstract class AbstractProduct implements IProduct {
        protected void printBefore(){
            System.out.println("before print"); // 这里所公共的实现
        }
    }
    
    public class AProduct extends AbstractProduct {
        private String name;
        public AProduct(String name){ 
            this.name = name;
        }
        @Override
        public void print() {
            this.printBefore();
            System.out.println("print A >>>"+name);
        }
    }
    
    public class BProduct extends AbstractProduct {
        private String name;
        public BProduct(String name){ 
            this.name = name;
        }
        @Override
        public void print() {
            this.printBefore();
            System.out.println("print B >>>"+name);
        }
    }

    Soalan kedua: Instalasi kelas ini dengan fungsi yang serupa telah menjadi masalah Parameter pembina setiap kelas adalah menyusahkan untuk memperbaharui objek setiap kali, jadi ia dirangkumkan ke dalam kilang ringkas corak.

    public class SimpleFactory {
        public static IProduct getProduct(String name){
            if("A".equals(name)){
                return new AProduct(name);
            }else if("B".equals(name)){
                return new BProduct(name);
            }else{
                throw new IllegalArgumentException();
            }
        }
    }

    Soalan ketiga: Model kilang ringkas tidak sesuai untuk pengembangan dan melanggar prinsip pembukaan dan penutup Setiap kali kelas ditambah, kelas kilang mesti diubah suai (jika kelas kilang dan kelas perniagaan adalah dua kecil Jika rakan kongsi menulisnya secara berasingan, ia tidak mengambil banyak masa untuk berkomunikasi...), jadi terdapat Corak Kaedah Kilang, yang prinsipnya adalah untuk mengabstrakkan kilang sederhana.

    public interface IFactory {
        IProduct getProduct();
    }
    
    public class AFactory implements IFactory {
        @Override
        public IProduct getProduct() {
            return new AProduct(AProduct.class.getName());
        }
    }
    
    public class BFactory implements IFactory {
        @Override
        public IProduct getProduct() {
            return new BProduct(BProduct.class.getName());
        }
    }

    Soalan 4: Tiba-tiba saya menemui sesuatu yang tidak baik, kerana kod telah menjadi banyak, kerana kami mempunyai 3 lapisan abstraksi untuk produk dengan fungsi yang serupa, dan kami juga telah mengabstraksikan 2 lapisan kelas kilang untuk setiap produk. Tetapi dalam senario perniagaan tertentu, kami tidak hanya membuat seketika kelas. Sebagai contoh, dalam permainan, jika kita ingin seorang askar dilengkapi dengan peralatan, pertama kita perlu melengkapkannya dengan senjata api (ada banyak senjata api, seperti senapang, senapang penembak curi, dll., gunakan soalan 1 untuk abstraksi), tapi lepas siapkan senjata api tu, kita kena lengkapkan juga dia dengan Bullet (terus guna kaedah soalan 1 untuk abstraksi), okay, sekarang kita boleh abstrak kelas kilang dua lapis, boleh mempunyai kilang yang mengeluarkan kedua-dua senjata api dan peluru? Ini ialah Corak Kilang Abstrak. Ringkasnya, anda boleh meletakkan beberapa produk berkaitan atau serupa ke dalam satu kilang untuk pengeluaran Tidak perlu membuka kilang berasingan .

    Juga untuk membetulkan saya, kod yang anda siarkan adalah corak kaedah kilang, bukan corak kilang abstrak.


    Memandangkan penyoal tidak menerima jawapan saya, saya akan menyebut beberapa perkataan lagi dan memberikan kes permohonan tertentu.

    Kita semua tahu bahawa generik Java dilaksanakan menggunakan pemadaman jenis (generik dikeluarkan semasa proses penyusunan javac dan penukaran jenis paksa ditambah). Jadi kita tidak boleh membuat instantiate objek secara langsung dengan T() baharu. Malah, ia boleh diselesaikan dengan menggunakan corak reka bentuk Corak Kaedah Kilang.

    Katakan kita mempunyai kelas yang menggunakan instantiasi generik.

    public class Foo<T>(){
        private T t;
        public Foo(){
           t = new T(); // 这个代码是有问题的,我们使用工厂设计模式进行改进
        }
    }

    Kami memberikan antara muka kilang seperti berikut:

    public interface IFactory<T>(){
        T create();
    }

    Kami kemudiannya boleh menggunakan kaedah berikut untuk memperbaikinya

    public class Foo<T>(){
        private T t;
        public <F extends IFactory<T>> Foo(F factory){
            // t = new T(); 
            factory.create();       
        }
    }

    Pada masa ini, kita boleh membuat instantiate Foo

    dengan cara berikut
    new Foo(new Ifactory<Integer>(){
        Integer create(){
            return new Integer(0);
        }
    });
    
    new Foo(new Ifactory<String>(){
        String create(){
            return "Hello";
        }
    });

    ps: Untuk mengelakkan terlalu bertele-tele, pelaksanaan kaedah kilang dilakukan di sini menggunakan kelas dalaman.

    balas
    0
  • Batalbalas