结合属性文件的工厂模式(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
- driver=design_pattern.reflection.abstract_factory.Driver
- teacher=design_pattern.reflection.abstract_factory.Teacher
Job接口
Job.java
- package design_pattern.reflection.abstract_factory;
- public interface Job {
- void showJobInfo();
- }
Driver类
Driver.java
- package design_pattern.reflection.abstract_factory;
- public class Driver implements Job{
- private int drivingYears;
- public Driver(){drivingYears = 0;}
- public Driver(int drivingYears){
- this.drivingYears = drivingYears;
- }
- @Override
- public void showJobInfo() {
- System.out.println("I work as a driver for " + drivingYears + " years!");
- }
- }
Teacher类
Teacher.java
- package design_pattern.reflection.abstract_factory;
- public class Teacher implements Job{
- private int teachingYears;
- public Teacher(){teachingYears = 0;}
- public Teacher(int teachingYears){
- this.teachingYears = teachingYears;
- }
- @Override
- public void showJobInfo() {
- System.out.println("I work as a teacher for " + teachingYears + " years!");
- }
- }
JobFactory工厂类,用于得到实现Job接口的实例
JobFactory.java
- package design_pattern.reflection.abstract_factory;
- import java.lang.reflect.Constructor;
- public class JobFactory {
- private static Job job = null;
- public static Job getInstance(String ClassName){
- try{
- job = (Job)Class.forName(ClassName).newInstance();
- }catch (Exception e) {
- e.printStackTrace();
- }
- return job;
- }
- public static Job getInstance(String ClassName, int workingYears){
- try{
- Constructor<?> constructor_workingYears = Class.forName(ClassName)
- .getConstructor(int.class);
- job = (Job)constructor_workingYears.newInstance(workingYears);
- }catch (Exception e) {
- e.printStackTrace();
- }
- return job;
- }
- }
测试类,包括job.properties获取具体的包和类名信息
Test.java
- package design_pattern.reflection.abstract_factory;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Properties;
- public class Test {
- public static void main(String[] args) throws FileNotFoundException, IOException {
- Properties pro = new Properties();
- File file = new File("./src/design_pattern/reflection/abstract_factory/job.properties");
- if(file.exists()){
- pro.load(new FileInputStream(file));
- }else{
- pro.setProperty("driver", "design_pattern.reflection.abstract_factory.Driver");
- pro.setProperty("teacher", "design_pattern.reflection.abstract_factory.Teacher");
- pro.store(new FileOutputStream(file), "JOB CLASS");
- }
- //pro.getProperty("driver") gets the direct path of Class ->Driver
- //1. constructor with parameters workingYears
- Job jobOfDriver = JobFactory.getInstance(pro.getProperty("driver"), 20);
- if(jobOfDriver != null){
- jobOfDriver.showJobInfo();
- }
- //2. without parameter in constructor
- Job jobOfTeacher = JobFactory.getInstance(pro.getProperty("teacher"));
- if(jobOfTeacher != null){
- jobOfTeacher.showJobInfo();
- }
- }
- }
输出:分别是利用反射有参构造的Driver和无参构造的Teacher
转载:http://blog.csdn.net/anialy/article/details/8034218
0 0
- 结合属性文件的工厂模式(java反射的应用)
- 结合属性文件的工厂模式(java反射的应用)
- 【Java高级】反射+工厂模式+属性文件的实例应用
- Java反射结合属性文件实现工厂模式
- 【设计模式】工厂模式结合反射技术的简单应用
- Java反射的工厂模式应用
- java反射机制工厂模式的应用
- Java结合反射和单例的工厂模式
- 反射结合工厂设计模式的使用
- 工厂模式(java反射的使用)
- java 反射和 工厂模式结合使用
- 反射机制与配置文件结合的工厂设计模式
- 工厂模式(与反射方法结合)
- [转] Java的反射机制+工厂模式
- java反射学习(结合工厂方法)
- java基础第九讲——反射、工厂设计模式、注解、线程、网络与线程的结合
- C#反射和抽象工厂的结合
- Java反射生成对象注入spring(结合工厂模式)
- 数据结构基础java实现—双向链表
- poj3009 冰球
- Android:圆形头像
- HDU1162最小生成树
- 网页宽度自动调整响应式网页
- 结合属性文件的工厂模式(java反射的应用)
- mysql 数据库导入导出方法总结(是时候总结)
- 用堆实现优先队列
- nyist5 暴力;kmp
- 10月28日
- mysql常用命令
- Java GC的工作原理
- Object-C的消息传递机制和method swizzling方法混淆
- 函数返回值—返回局部变量