利用反射技术完善工厂模式
2013-01-30 22:12
447 查看
当不用反射时,例程如下
当我们在添加一个子类如banana的时候,为使“工厂”支持这新增的类,就需要修改工厂的代码了。这对工厂类的checkin有引入bug的风险。
能不能找一种方法避免对工厂类的改动呢?
现在我们看看利用反射机制:
现在就算我们添加任意多个子类的时候,利用class.forName().newInstance()时,工厂类就不需要修改。
上面的代码虽然可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。
下面我们 来看看:结合属性文件的工厂模式
首先创建 一个fruit.properties的资源文件,
内容
然后编写 主类代码
//定义接口 interface fruit{ public abstract void eat(); } class Apple implements fruit{ public void eat(){ System.out.println("Apple"); } } class Orange implements fruit{ public void eat(){ System.out.println("Orange"); } } // 构造工厂类 // 后如果我们在添加其他的实例的时候只需要修改工厂类 class Factory{ public static fruit getInstance(String fruitName){ fruit f=null; if("Apple".equals(fruitName)){ f=new Apple(); } if("Orange".equals(fruitName)){ f=new Orange(); } return f; } } class hello{ public static void main(String[] a){ fruit f=Factory.getInstance("Orange"); f.eat(); } }
当我们在添加一个子类如banana的时候,为使“工厂”支持这新增的类,就需要修改工厂的代码了。这对工厂类的checkin有引入bug的风险。
能不能找一种方法避免对工厂类的改动呢?
现在我们看看利用反射机制:
package Reflect; interface fruit{ public abstract void eat(); } class Apple implements fruit{ public void eat(){ System.out.println("Apple"); } } class Orange implements fruit{ public void eat(){ System.out.println("Orange"); } } class Factory{ public static fruit getInstance(String ClassName){ fruit f=null; try{ f=(fruit)Class.forName(ClassName).newInstance(); }catch (Exception e) { e.printStackTrace(); } return f; } } class hello{ public static void main(String[] a){ fruit f=Factory.getInstance("Reflect.Apple"); if(f!=null){ f.eat(); } } }
现在就算我们添加任意多个子类的时候,利用class.forName().newInstance()时,工厂类就不需要修改。
上面的代码虽然可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。
下面我们 来看看:结合属性文件的工厂模式
首先创建 一个fruit.properties的资源文件,
内容
apple=Reflect.Apple orange=Reflect.Orange
然后编写 主类代码
package Reflect; import java.io.*; import java.util.*; interface fruit{ public abstract void eat(); } class Apple implements fruit{ public void eat(){ System.out.println("Apple"); } } class Orange implements fruit{ public void eat(){ System.out.println("Orange"); } } //操作属性文件类 class init{ public static Properties getPro() throws FileNotFoundException, IOException{ Properties pro=new Properties(); File f=new File("fruit.properties"); if(f.exists()){ pro.load(new FileInputStream(f)); }else{ pro.setProperty("apple", "Reflect.Apple"); pro.setProperty("orange", "Reflect.Orange"); pro.store(new FileOutputStream(f), "FRUIT CLASS"); } return pro; } } class Factory{ public static fruit getInstance(String ClassName){ fruit f=null; try{ f=(fruit)Class.forName(ClassName).newInstance(); }catch (Exception e) { e.printStackTrace(); } return f; } } class hello{ public static void main(String[] a) throws FileNotFoundException, IOException{ Properties pro=init.getPro(); fruit f=Factory.getInstance(pro.getProperty("apple")); if(f!=null){ f.eat(); } } }
相关文章推荐
- 利用反射实现工厂模式
- 在工厂模式里面利用反射机制动态调用对象方法
- 【设计模式】工厂模式结合反射技术的简单应用
- 反射技术在工厂设计模式中的应用
- 利用反射机制实现工厂设计模式的高扩展性
- 利用反射机制实现工厂设计模式的高扩展性
- 利用反射工厂模式支持多数据库访问
- 利用反射机制实现工厂模式
- javaweb项目中利用反射实现工厂模式
- 动态代理,工厂模式和反射技术
- 利用反射增强工厂模式
- 自己在项目中的学习总结:利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口
- Java设计模式之工厂模式(利用反射实现)
- Java中利用反射的思想解决工厂设计模式的耦合问题
- 利用反射实现工厂模式.
- 利用反射动态实例化对象(工厂模式)
- JAVA:将反射技术应用于工厂模式(Factory)和单例模式(Singleton)的简单代码
- 反射--工厂设计模式
- 利用反射工厂来产生对象
- 利用dot Net技术中反射及代码发送的动态退化或同步化接口封装