简述:
利用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