将反射应用在工厂模式上

来源:互联网 发布:2016年中国零售业数据 编辑:程序博客网 时间:2024/06/08 15:21

一、将反射应用在工厂模式上

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

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

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、在程序的开发中使用反制机制并结合属性文件,可以达到程序代码与配置文件相分享的目的。

0 0
原创粉丝点击