02 【创建型】抽象工厂模式 理解与使用

抽象工厂

大白话:一个最大的抽象工厂,它里面不仅有生产手机的工厂,也有生产家用电器的工厂,工厂里面套工厂,这就是抽象工厂,通过工厂生产出需要的工厂,再有生产出的工厂建造

生产不一样的产品

 

 

 开个玩笑,我怎么可能做PHP呢 JAVA是世界上最好的语言,没有之一

 

 

就按照这个例子,有一家抽象工厂,它可以有生产手机和生产电器的工厂,它的工厂有具体的实现类(小米或者华为的工厂)

 

 

按照图形化来理解

 

 

1、创建一个生产手机的工厂

 

public interface PhoneFactory {

    //生产方法
    void create();
}

 

2、创建一个生产电器的工厂

//电器工厂,生产电器
public interface DianFactory {

    //创造电器
    void createDian();

}

 

3、创建一个抽象工厂,这个抽象工厂可以同时生产电器、手机

public abstract class Factory {

    //获取手机工厂
    public abstract PhoneFactory getPhoneFactory(String type);

    //获取电器工厂
    public abstract DianFactory getDianFactory(String type);

}

 

4、具体的抽象工厂继承类 比如小米可以生产、华为也可以生产

//小米工厂
public class XiaoMiFactory extends Factory {

    @Override
    public PhoneFactory getPhoneFactory(String type) {
        return new XiaomiPhone();
    }

    @Override
    public DianFactory getDianFactory(String type) {
        return new XiaoMiDian();
    }
}

小米手机的工厂生产小米手机、小米电器

public class XiaomiPhone implements PhoneFactory {

    @Override
    public void create() {
        System.out.println("小米手机");
    }
}
public class XiaoMiDian implements DianFactory {

    @Override
    public void createDian() {
        System.out.println("小米生产电器");
    }
}

 

同理、华为也可以继承工厂类、它也可以生产手机和电器

public class HuaWeiFactory extends Factory {

    @Override
    public PhoneFactory getPhoneFactory(String type) {
        return new HuaWeiPhone();
    }

    @Override
    public DianFactory getDianFactory(String type) {
        return new HuaWeiDian();
    }
}

 

public class HuaWeiPhone implements PhoneFactory {

    @Override
    public void create() {
        System.out.println("生产华为手机");
    }
}

 

public class HuaWeiDian implements DianFactory {

    @Override
    public void createDian() {
        System.out.println("华为电器");
    }
}

 

5.创建一个工厂调度器,来取出需要的工厂

public class FactoryProducer {

    //按照名称获取工厂
    public static Factory getFactory(String name){

        if ("XIAOMI".equals(name)) {
            return new XiaoMiFactory();
        } else if ("HUAWEI".equals(name)) {
            return new HuaWeiFactory();
        }
        return null;
    }
}

 

最后我们main方法测试,传入HUAWEI, 则调出的是华为工厂,然后调用华为生产手机或者华为生产电器即可

public static void main(String[] args) {


        Factory factory = getFactory("HUAWEI");

        PhoneFactory phoneFactory = factory.getPhoneFactory(null);

        phoneFactory.create();

    }

 

参考:https://www.runoob.com/design-pattern/design-pattern-intro.html

码云:https://gitee.com/mrc1999/23GOF

 

posted @ 2019-10-30 21:28  程序猿小码  阅读(230)  评论(0编辑  收藏  举报