博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转!! 工厂方法--反射机制
阅读量:5023 次
发布时间:2019-06-12

本文共 2946 字,大约阅读时间需要 9 分钟。

简单工厂模式:

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();    } }

 但是,我们考虑到 ,当我们在添加一个子类的时候,就需要修改工厂类了。如果我们要添加很多子类的时候,要修改的就会很多。

所以,我们利用java 的反射机制:

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();  //java反射机制        }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.Appleorange=Reflect.Orange

 

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();        }    }}

 

我的总结:工厂方法也可以如此利用反射机制设计,还可以通过配置属性文件的方式设计,nice!!

 

  

转载于:https://www.cnblogs.com/wuyun-blog/p/4556863.html

你可能感兴趣的文章
Android读取url图片保存及文件读取
查看>>
完整ASP.Net Excel导入
查看>>
判断CPU大小端示例代码
查看>>
ARTS打卡第13周
查看>>
循环队列的运用---求K阶斐波那契序列
查看>>
pta 编程题14 Huffman Codes
查看>>
初始化bootstrap treeview树节点
查看>>
python selenium向<sapn>标签中写入内容
查看>>
JS常用坐标
查看>>
使用”结构化的思考方式“来编码和使用”流程化的思考方式“来编码,孰优孰劣?...
查看>>
C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】...
查看>>
关于git的认证方式
查看>>
字符串按照字典序排列
查看>>
IOS 开发调用打电话,发短信
查看>>
CI 框架中的日志处理 以及 404异常处理
查看>>
keepalived介绍
查看>>
css3 标签 background-size
查看>>
python itertools
查看>>
Linux内核调试技术——jprobe使用与实现
查看>>
样式、格式布局
查看>>