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

简述:

利用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




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值