您的位置:首页 > 编程语言 > Java开发

反射工厂模式

2016-05-26 16:10 288 查看
将反射应用在工厂模式上

工厂设计模式在实际的开发中使用得非常多,之前读者已经学习过简单的工厂模式,通过简单的工厂设计模式可以达到类的 解耦合目的,但是之前的工厂设计模式依然存在问题,那就是在增加一个子类时都需要修改工厂类,这样很麻烦。现在就可以通过反射机制修改工厂类,这样肯定会 非常麻烦。学习完反射机制之后,实际上,此时就可以通过反射机制来改善工厂类,让其在增加子类时可以不用做任何的修改,就能达到功能的扩充,如下:

例:使用反射完成工厂设计

package org.lxh.demo15.factorydemo;

interface Fruit {   //水果接口

public void eat() ;    //吃水果

}

class Apple implements Fruit{ //定义苹果

public void eat() {

   System.out.println("**吃苹果。");  

}

}

class Orange implements Fruit{

public void eat() {

   System.out.println("**吃橘子。");  

}

}

class Factory{

public static Fruit getInstance(String className){

   Fruit fruit = null ;

   try{

    fruit = (Fruit) Class.forName(className).newInstance() ;

   }catch(Exception e ){

    e.printStackTrace() ;

   }

   return fruit ;

}

}

public class FactoryDemo{

public static void main(String args[]){

   //通过工厂类取得接口实例,传入完整的包.类名称

   Fruit f = Factory.getInstance("org.lxh.demo15.factorydemo.Apple") ;

   if(f!=null){ //判断是否取得接口实例

    f.eat() ;

   }

}

}

输出:

**吃苹果。

以上的工厂操作类中使用了反射操作取得Fruit实例,这样无论增加多少个子类,工厂类都不用做任何的修改。

二、结合属性文件的工厂模式

以上操作代码虽然可以通过反射取得接口的实例,但是在操作时需要传入完整的包.类名称,而且用户也无法知道一个接口有多少个可以使用的子类,所以此时可以通过属性文件的形式配置所要的子类信息。

例:属性文件fruit.properties

apple = org.lxh.demo15.factorydemo02.Apple

orange = org.lxh.demo15.factorydemo02.Orange

在属性文件中使用apple和orange表示完整的包.类名称,这样在使用时直接通过属性名称即可。

例:属性操作类

class Init{

public static Properties getPro(){

   Properties pro = new Properties() ;

   File f = new File("d:\\fruit.properties") ;

   try{

    if(f.exists()){        //属性文件中已存在

     pro.load(new FileInputStream(f)) ;//读取属性

    }else{      //建立一个新的属性文件,同时设置好默认内容

     pro.setProperty("apple", "org.lxh.demo15.factorydemo02.Apple") ;

     pro.setProperty("orange", "org.lxh.demo15.factorydemo02.Orange") ;

     pro.store(new FileOutputStream(f), "FRUIT CLASS") ;

    }

   }catch(Exception e){

    e.printStackTrace() ;

   }

   return pro ;

}

}

此类中的主要功能是取得属性文件中的配置信息,如果属性文件不存在,则创建一个新的,并设置默认值。

例:测试程序

public class FactoryDemo02 {

public static void main(String args[]){

   Properties pro = Init.getPro() ;

   //通过工厂类取得接口实例,通过属性的key传入完整的包.类名称

   Fruit f = Factory.getInstance(pro.getProperty("apple")) ;

   if(f!=null){

    f.eat() ;

   }

}

}

在通过工厂类取得接口实例时,直接输入属性的key就可以找到其完整的包.类名称,以达到对象的实例化功能。

在本程序中可以发现,程序很好地实现了代码与配置的分离。通过配置文件配置要使用的类,之后通过程序读取配置文件,以完成具体的功能,如下。当然,这些程序完成的前提是基于接口,所以接口在实际开发中用处是最大的。

    (配置文件决定程序的运行)

程序 ---> 程序代码    --   运行时读取属性文件以   --> 配置文件 (保存程序运行的相关信息)

      找到相应的配置信息

    图,代码与文件相分离

   本章要点

1、Class类是反射机制操作的源头。

2、Class类的对象有3种实例化方式:

(1)通过Object类中的getClass()方法。

(2)通过“类.class”的形式

(3)通过Class.forName()方法,此种方式最为常用。

3、可以通过Class类中的newInstance()方法进行对象的实例化操作,但是要求类中必须存在无参构造方法,如果类中没有无参构造,则必须使用Constructor类完成对象的实例化操作。

4、可以通过反射取得一个类所继承的父类、实现的接口、类中的全部构造方法、全部普通方法及全部属性。

5、使用反射机制可以通过Method调用类中的方法,也可以直接操作类中的属性。

6、动态代理可以解决开发中代理类过多的问题,提供统一的代理功能实现。

7、在程序的开发中使用反制机制并结合属性文件,可以达到程序代码与配置文件相分享的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息