反射技术在工厂设计模式中的应用

package leotoneo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/*//学习反射技术后,感觉为什么要引入这一个技术:创建个对象那么麻烦,调用个方法那么麻烦,修改个属性那么麻烦(重要的事情说三遍)。
直到,看到一些对象的配置文件之后,原来才知道,反射技术可以直接通过配置文件来读取一些类的属性、方法,并且创建类的对象。
今天想结合简单的工厂模式中运用的反射方法来自己熟练一下反射技术和工厂设计模式。

举个富士康生产手机的例子:
*/
//定义一个手机接口类
interface Phone{
	public void brand();
}
//定义小米手机类
class MiPhone implements Phone{

	String name;
	public MiPhone(){}
	public MiPhone(String name){
		this.name = name;
	}
	@Override
	public void brand() {
		System.out.println(this.name+"手机");
		
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return this.name;
	}
}
//定义苹果手机类
class IPhone implements Phone{

	String name;
	public IPhone(){}
	public IPhone(String name){
		this.name = name;
	}
	@Override
	public void brand() {
		// TODO Auto-generated method stub
		System.out.println(this.name+"手机");
	}
	public String toString() {
		// TODO Auto-generated method stub
		return this.name;
	}
}
public class FactoryReflect {
	public static void main(String[] args){
		//生产一台小米手机
		Phone MiPhone = createPhone("src/infoMi.txt");
		MiPhone.brand();;
		//生产一台苹果手机
		Phone IPhone = createPhone("src/infoApple.txt");
		IPhone.brand();
	}
	//工厂模式的实质就是 :定义一个静态的方法去创建对象
	public static Phone createPhone(String string){
		Phone xPhone = null;
		try {
			//定义输入缓冲流,为了是读取配置文件中的内容
			BufferedReader bufferedReader = new BufferedReader(new FileReader(string));
			//读取第一行内容    : 包名.类名
			String line = bufferedReader.readLine();
			//获取类的字节码对象
			Class phoneClass = Class.forName(line);
			//获取类的构造方法
			Constructor  phoneConstructor = phoneClass.getConstructor(null);
			//创建类的对象
			xPhone =(Phone) phoneConstructor.newInstance(null);
			//依次读取配置文件中的其他配置信息
			while((line =bufferedReader.readLine())!=null){
				//以等号为分隔符 对属性的设置进行拆分  
				String[] datas = line.split("=");
				//得到属性变量名
				Field f = phoneClass.getDeclaredField(datas[0]);
				//获取访问权限
				f.setAccessible(true);
				//判断属性的变量类型
				if(f.getType() == String.class){
					//将配置文件中设置的值赋值给属性变量
					f.set(xPhone, datas[1]);
				}else{
					f.set(xPhone, Integer.parseInt(datas[1]));
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return xPhone;
		
	}
}

你可能感兴趣的:(java,设计模式)