结合属性文件的工厂模式(java反射的应用)

来源:互联网 发布:tgp腾讯游戏客户端mac 编辑:程序博客网 时间:2024/06/05 03:04

简述:

利用Java反射实现抽象工厂的工厂方法模式

Job作为一个接口,其方法为void  showJobInfo(),分别被Driver类和Teacher类实现

JobFactory作为一个工厂,返回的是实现Job接口的Job对象,分别指向不同的实例(Teacher和Driver的实例)

其中构造Teacher和Driver的方法分别是无参构造函数,和有参构造函数,之后再

使用Class的ForClass(ClassName).newInstance 以及 Constructor方法获取实例

其中,使用了job.properties文件存储了类和其包名,properties对象pro的信息从文件流读取


所有的文件及代码实现


如图:


配置文件

job.properties

[plain] view plaincopy
  1. driver=design_pattern.reflection.abstract_factory.Driver  
  2. teacher=design_pattern.reflection.abstract_factory.Teacher  

Job接口

Job.java

[java] view plaincopy
  1. package design_pattern.reflection.abstract_factory;  
  2.   
  3. public interface Job {  
  4.     void showJobInfo();  
  5. }  

Driver类

Driver.java

[java] view plaincopy
  1. package design_pattern.reflection.abstract_factory;  
  2.   
  3. public class Driver implements Job{  
  4.     private int drivingYears;  
  5.     public Driver(){drivingYears = 0;}  
  6.     public Driver(int drivingYears){  
  7.         this.drivingYears = drivingYears;  
  8.     }  
  9.     @Override  
  10.     public void showJobInfo() {  
  11.         System.out.println("I work as a driver for " + drivingYears + " years!");  
  12.     }  
  13.   
  14. }  

Teacher类

Teacher.java

[java] view plaincopy
  1. package design_pattern.reflection.abstract_factory;  
  2.   
  3. public class Teacher implements Job{  
  4.     private int teachingYears;  
  5.     public Teacher(){teachingYears = 0;}  
  6.     public Teacher(int teachingYears){  
  7.         this.teachingYears = teachingYears;  
  8.     }  
  9.     @Override  
  10.     public void showJobInfo() {  
  11.         System.out.println("I work as a teacher for " + teachingYears + " years!");  
  12.     }  
  13.   
  14. }  


JobFactory工厂类,用于得到实现Job接口的实例

JobFactory.java

[java] view plaincopy
  1. package design_pattern.reflection.abstract_factory;  
  2.   
  3. import java.lang.reflect.Constructor;  
  4.   
  5. public class JobFactory {  
  6.     private static Job job = null;  
  7.     public static Job getInstance(String ClassName){  
  8.         try{  
  9.             job = (Job)Class.forName(ClassName).newInstance();  
  10.         }catch (Exception e) {  
  11.             e.printStackTrace();  
  12.         }  
  13.         return job;  
  14.     }  
  15.     public static Job getInstance(String ClassName, int workingYears){  
  16.         try{  
  17.             Constructor<?> constructor_workingYears = Class.forName(ClassName)  
  18.                         .getConstructor(int.class);  
  19.             job = (Job)constructor_workingYears.newInstance(workingYears);  
  20.         }catch (Exception e) {  
  21.             e.printStackTrace();  
  22.         }  
  23.         return job;  
  24.     }  
  25. }  

测试类,包括job.properties获取具体的包和类名信息

Test.java

[java] view plaincopy
  1. package design_pattern.reflection.abstract_factory;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.util.Properties;  
  9.   
  10. public class Test {  
  11.     public static void main(String[] args) throws FileNotFoundException, IOException {  
  12.         Properties pro = new Properties();  
  13.         File file = new File("./src/design_pattern/reflection/abstract_factory/job.properties");  
  14.         if(file.exists()){  
  15.             pro.load(new FileInputStream(file));  
  16.         }else{  
  17.             pro.setProperty("driver""design_pattern.reflection.abstract_factory.Driver");  
  18.             pro.setProperty("teacher""design_pattern.reflection.abstract_factory.Teacher");  
  19.             pro.store(new FileOutputStream(file), "JOB CLASS");  
  20.         }  
  21.         //pro.getProperty("driver") gets the direct path of Class ->Driver  
  22.         //1. constructor with parameters workingYears  
  23.         Job jobOfDriver = JobFactory.getInstance(pro.getProperty("driver"), 20);  
  24.         if(jobOfDriver != null){  
  25.             jobOfDriver.showJobInfo();  
  26.         }  
  27.           
  28.         //2. without parameter in constructor  
  29.         Job jobOfTeacher = JobFactory.getInstance(pro.getProperty("teacher"));  
  30.     if(jobOfTeacher != null){  
  31.             jobOfTeacher.showJobInfo();  
  32.         }  
  33.     }  
  34. }  

输出:分别是利用反射有参构造的Driver和无参构造的Teacher

转载:http://blog.csdn.net/anialy/article/details/8034218

0 0
原创粉丝点击