java编写的简单工厂模式
传统的工厂设计模式每增加一个接口的子类就需要修改工厂类。
由于太过于麻烦可以通过反射来进行处理,因为Class类可以使用newInstance()来实例化对象,使用Class.forName()接受类名称。
引入反射后每当有新子类增加啊,无需修改工厂类代码就就可以很方便的进行接口子类扩容。
package reflectexcrise.reflect; interface Ifruit{ void eat(); } class Apple implements Ifruit{ public void eat() { System.out.println("吃苹果"); } } class Orange implements Ifruit{ public void eat() { System.out.println("吃橘子"); } } class Watermellon implements Ifruit{ public void eat() { System.out.println("吃西瓜"); } } class Factory{ private Factory() {} public static Ifruit getInstance(String ClassName) { //在工厂类中,通过反射创建传入的ClassName的实例化对象并返回,并且完成了向上转型 Ifruit ifruit=null; try { ifruit=(Ifruit)Class.forName(ClassName).newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ifruit; } } public class test { public static void main(String[] args) { Ifruit ifruit=Factory.getInstance("reflectexcrise.reflect.Orange"); //调用Ifruit类的eat()方法。 ifruit.eat(); Ifruit ifruit1=Factory.getInstance("reflectexcrise.reflect.Apple"); ifruit1.eat(); } }
使用Class.forName()方法,传入的类名称必须包含包名称,即,包名称.类名称。
再调用newInstance()实例化具体类的对象