将反射用于工厂模式
来源:互联网 发布:a 寻路算法 c 编辑:程序博客网 时间:2024/05/22 09:40
先来看看,如果不用反射的时候,的工厂模式吧:
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(); } }
这样,当我们在添加一个子类的时候,就需要修改工厂类了。如果我们添加太多的子类的时候,改的就会很多。
现在我们看看利用反射机制:
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(); } }}
现在就算我们添加任意多个子类的时候,工厂类就不需要修改。
上面的爱吗虽然可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。
下面我们来看看: 结合属性文件的工厂模式
首先创建一个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(); } }}
【运行结果】:Apple
0 0
- 将反射用于工厂模式
- 将反射用于工厂模式
- 将反射用于工厂模式
- java 反射解析,将反射用于工厂模式【实例】
- 将反射应用在工厂模式上
- 反射工厂模式
- 工厂模式 + 反射改进
- 工厂模式与反射
- 抽象工厂模式+反射
- 反射工厂模式
- 工厂模式中的反射
- 简单工厂模式+反射
- 反射--工厂设计模式
- 利用反射实现工厂模式.
- .Net反射工厂设计模式
- 策略模式+简单工厂+反射
- 简单工厂模式与反射
- java反射实现工厂模式
- String类型与数值型(int,float,double等)转换
- 模拟电路中,为什么把运算放大器的放大倍数A做的很大?
- Python *与** 参数问题
- 2015 年 JXNU_ACS 算法组寒假第二次周赛
- C++中内存泄漏浅谈几种情况(二)
- 将反射用于工厂模式
- java中判断字符串是否为数字的三种方法
- fedora下vim配置笔记
- UVa 253
- 我愿生命从容
- 亲手装的一把新椅子
- 你为什么还不够幸运?
- 【Git】使用Git Bash将代码托管到Git@OSC的简单操作介绍
- 第47题 Integer to Roman