/*
 * 简单工厂模式
 *    在这种模式中当我们想加入一个草莓时就必须得要改动FruitFactory往其中加入一个if语句但这种方式
 *    违背了面向对象的基本原则之一开闭原则开就是说可以对系统进行扩张闭就是说在扩展的同时不能修改系统的源代码
 * 但是在工厂方法模式中就很好的解决了这个问题
 * */
/*interface Fruit {
   public void getFruit();
}
class Appel implements Fruit{
 public void getFruit() {
  System.out.println("采集苹果");
 }
}
class Banana implements Fruit{
 public void getFruit() {
  System.out.println("采集香蕉");
 }
}
class Pear implements Fruit{
 public void getFruit() {
  System.out.println("采集梨子");
 }
}
class FruitFactory{
 public static Fruit getFruit(String type) throws Exception{
  if(type.equalsIgnoreCase("appel")){
   return Appel.class.newInstance();
  }
  else if(type.equalsIgnoreCase("banana")){
   return Banana.class.newInstance();
  }
  else if(type.equalsIgnoreCase("pear")){
   return Pear.class.newInstance();
  }
  else {
   return null;
  }
 }
}
public class factoryMethod{
 public static void main(String a[]) throws Exception{
  Fruit appel = FruitFactory.getFruit("appel");
  appel.getFruit();
  Fruit banana = FruitFactory.getFruit("banana");
  banana.getFruit();
  Fruit pear = FruitFactory.getFruit("pear");
  pear.getFruit();
 }
}*/
/*
 * 工厂方法模式的意义在于定义一个创建产品对象的工厂接口
 *
 * 将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建这样核心类成为一个
抽象工厂角色仅负责具体工厂子类必须实现的接口
这样进一步抽象化的好处是使得工厂方法模式可以使系
统在不修改具体工厂角色的情况下引进新的产品。
1.抽象工厂Creator角色工厂方法模式的核心任何工厂类都必须实现这个接口。
2.具体工厂 Concrete  Creator角色具体工厂类是抽象工厂的一个实现负责实例化产品对象。
3.抽象Product角色工厂方法模式所创建的所有对象的父类它负责描述所有实例所共有的公共接口。
4.具体产品Concrete Product角色工厂方法模式所创建的具体实例对象
 * */
interface Fruit {
 public void get();
}
interface FruitFactory{
    public Fruit getFruit();
}
class Appel implements Fruit{
 public void get() {
         System.out.println("采集苹果");
 }
}
class AppelFactory implements FruitFactory{
 public Fruit getFruit() {
  return new Appel();
 }
}
class Banana implements Fruit{
 public void get() {
  System.out.println("采集香蕉");
 }
}
class BananaFactory implements FruitFactory{
    public Fruit getFruit() {
     return new Banana();
    }
}
/*class Pear implements Fruit{
      再次的添加一个梨子的时候只要创建一个梨子类并且实现水果接口
      还要创建一个梨子工厂创建梨子
}
*/
public class factoryMethod{
 public static void main(String a[]) throws Exception{
  FruitFactory fruitFactory = new AppelFactory();
  Fruit appel = fruitFactory.getFruit();
  appel.get();
  fruitFactory = new BananaFactory();
  Fruit banana = fruitFactory.getFruit();
  banana.get();
 }
}