工厂模式(与反射方法结合)

//要生产的产品放在了一个class文件,其实应该分开会最好
package factory;

public class Factory 
{
}
interface fruit//共同实现的接口
{
	abstract void eat();
}
class li implements fruit
{

	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("li eats fruit");
	}
	
}

class lin implements fruit
{

	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("lin eats fruit");
	}
	
}

class xin implements fruit
{

	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("xin eats fruit");
	}
	
}


package factory;

public class TheFactory {

	/**
	 * @param args
	 */
	public static fruit getPersonName(String person)
	{
		fruit f=null;
		/*Factory ff=new Factory();采用非反射的方法,如果有新的产品加入会增加代码
		if("li".equals(person))
			f=new li();
		if("lin".equals(person))
			f=new lin();
		//......*/
		//采用反射方法更加方便,直接根据Class新建一个对象
		try {
			f=(fruit)Class.forName(person).newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return f;
	}
	

}

package 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;

class init
{
	public static Properties getPro() throws FileNotFoundException, IOException
	{
		Properties pro=new Properties();
		File f=new File("fruit.properties");
		if(f.exists())
		{
			pro.load(new FileInputStream(f));
		}
		else
		{
//第一次写成了Factory.li应该是包名.类名,所以第一次运行的文件出现了错误,程序运行出错,后来手动修改了文件
			pro.setProperty("li", "factory.li");
			pro.setProperty("lin", "factory.lin");
			pro.setProperty("xin", "factory.xin");
			pro.store(new FileOutputStream(f), "FRUIT CLASS");
		}
		
		return pro;
	}
}
public class Test {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException {
		// TODO Auto-generated method stub
   // fruit f=TheFactory.getPersonName("li");采用非反射方法
    fruit f=TheFactory.getPersonName("factory.li");//采用反射方法需要类的完整路径名
    f.eat();
    
    //结合属性文件
    Properties pro=init.getPro();
    f=TheFactory.getPersonName(pro.getProperty("lin"));
    f.eat();
	}

}

properties文件的常见方法,其实就是相当于一个存key=value的文件

Properties()构建一个无默认值的空属性列表

void load(InputStream in) 从指定的输入流中读取属性列表(键和元素对)

String getProperty(String key)用指定的键在此属性列表中搜索属性

Object setProperty(String key,String value) 将指定的key映射到指定的value

void store(OutputStream out,String comments)将Properties表中的属性列表写入输出流




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值