您的位置:首页 > 其它

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

2015-06-10 15:30 204 查看
//要生产的产品放在了一个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表中的属性列表写入输出流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: