工厂模式(与反射方法结合)
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表中的属性列表写入输出流
相关文章推荐
- Python 新浪微博元素 (Word, Screen Name)词汇多样性
- 阅读<构建之法>10、11、12章
- 【原创】bootstrap框架的学习 第五课
- 图形学之光照
- 《C与指针》学习笔记
- 15.7 多子网故障转移群集
- Windows.old文件夹怎么删除?Windows.old文件夹删除方法
- Spiral Matrix && Spiral Matrix II
- 理解Fragment生命周期
- apache prefork 模块指令分析
- 黑马程序员——Java概述
- Java线程(九):Condition-线程通信更高效的方式
- 数据库,比如 100 用户同时来访,要采取什么技术解决?
- 阅读《构建之法》第10、11、12章
- 线性表学习归纳总结五:不带头结点的循环链表
- 类
- 菜鸟学Android笔记(二十七):Response下载
- 不安装oracle,配置plsql
- adb常用命令--概况
- Java多线程系列--“JUC原子类”04之 AtomicReference原子类