public class DesignPattern {

    public static void main(String[] args) {

        //抽象工厂允许获取不同种类的工厂,并进行工厂方法的调用,获取想要的对象
        FactoryProducer producer = new FactoryProducer();
        //获取pizza的制作工厂
        AbstractFactory pizzaFactory = producer.getFactory("PizzaFactory");
        //pizza的北京口味
        Pizza beijingPizza = pizzaFactory.getPizza("BeijingPizza");
        beijingPizza.taste();
        //pizza的南京口味
        Pizza nanjingPizza = pizzaFactory.getPizza("NanjingPizza");
        nanjingPizza.taste();
        //获取面包的制作工厂
        AbstractFactory breadFactory = producer.getFactory("BreadFactory");
        //面包的北京口味
        Bread beijingBread = breadFactory.getBread("BeijingBread");
        beijingBread.taste();
        //面包的南京口味
        Bread nanjingBread = breadFactory.getBread("NanjingBread");
        nanjingBread.taste();


    }

}
interface Pizza{
    //不同的pizza有不同的口味
    void taste();
}
interface Bread{
    //不同的面包有不同的口味
    void taste();
}

class BeijingPizza implements Pizza{
    @Override
    public void taste() {
        System.out.println("北京pizza口味");
    }
}
class NanjingPizza implements Pizza{
    @Override
    public void taste() {
        System.out.println("南京pizza口味");
    }
}
class BeijingBread implements Bread{
    @Override
    public void taste() {
        System.out.println("北京面包的口味");
    }
}
class NanjingBread implements Bread{
    @Override
    public void taste() {
        System.out.println("南京面包的口味");
    }
}
//抽象工厂
abstract class AbstractFactory{

  public abstract Pizza getPizza(String type);
  public abstract Bread getBread(String type);

}
//pizza工厂
class PizzaFactory extends AbstractFactory{

    @Override
    public Pizza getPizza(String type) {
        Pizza pizza = null;
        if(type == null){
            System.out.println("传入参数有误");
        }else{
            try {
                pizza = (Pizza)Class.forName("com.zhouge.design.test." + type).newInstance();
            } catch (Exception e) {
                System.out.println("输入信息有误");
            }
        }
        return pizza;
    }

    @Override
    public Bread getBread(String type) {
        return null;
    }
}
//面包工厂
class BreadFactory extends AbstractFactory{

    @Override
    public Pizza getPizza(String type) {
       return null;
    }

    @Override
    public Bread getBread(String type) {
        Bread bread = null;
        if(type == null){
            System.out.println("传入参数有误");
        }else{
            try {
                bread = (Bread) Class.forName("com.zhouge.design.test." + type).newInstance();
            } catch (Exception e) {
                System.out.println("输入信息有误");
            }
        }
        return bread;
    }
}
//工厂的工厂
class FactoryProducer{

    public  AbstractFactory getFactory(String factoryName){
        AbstractFactory factory = null;
        if(factoryName == null){
            System.out.println("工厂名不能为空");
        }else {
            try {
                factory = (AbstractFactory) Class.forName("com.zhouge.design.test." + factoryName).newInstance();
            } catch (Exception e) {
                System.out.println("该工厂不存在");
            }
        }
        return factory;
    }
}