public class DesignPattern {

    public static void main(String[] args) {

        //工厂设计模式便于用户使用,可以屏蔽底层实现细节,便于用于直接获得想要的东西,而且方便扩展
        //无需修改工厂代码,就可以扩展想要得到的东西,使用场景如下:
        //1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,
        //用户可以选择记录日志到什么地方。 
        //2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
        //3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",
        //可以把这三个作为产品类,共同实现一个接口。
        AnimalFactory factory = new AnimalFactory();
        Animal dog = factory.getAnimal("Dog");
        dog.eat();
        Animal cat = factory.getAnimal("Cat");
        cat.eat();

    }

}
interface Animal{
    //定义抽象方法,不同实例可以对其具有不同的实现
    void eat();
}
class Dog implements Animal{
    @Override
    public void eat() {
        System.out.println("狗要吃东西");
    }
}
class Cat implements Animal{
    @Override
    public void eat() {
        System.out.println("猫要吃东西");
    }
}

class AnimalFactory{

    public Animal getAnimal(String str){
        Animal animal = null;
        if(str == null){
            System.out.println("传入参数有误");
            return null;
        }else{
            try {
               //使用反射,无需进行if else判断,缺点是需要将所有类放入同一个包,但可以进行优化
               //即用户输入全类名 
                animal =  (Animal) Class.forName("com.zhouge.design.test." + str).newInstance();
            } catch (Exception e) {
                System.out.println("该动物不存在");
            }
        }
        return animal;
    }

}