JAVA工厂模式举例

来源:互联网 发布:jumpsoles 淘宝 编辑:程序博客网 时间:2024/06/06 05:09

本文所使用的工具是MyEclipse

1,创建配置文件

首先,新建工程Cust,在scr下,创建一个配置文件 config.properties , 里面内容为

dao=cn.itheima.dao.CustDaoImpl

service=cn.itheima.service.CustServiceImpl

保存。

2,创建两个接口和类。

CustDao接口

package cn.itheima.dao;public interface CustDao {/* * 增加用户的方法 * */public int addUser();}

CustService接口

 

package cn.itheima.service;import cn.itheima.bean.Cust;public interface CustService {/* * 增加用户的方法 * 参数是一个javaBean * */public void addUser(Cust cust);}

CustDaoImpl

 

package cn.itheima.dao;public class CustDaoImpl implements CustDao{public int addUser() {// TODO Auto-generated method stubreturn 0;}}

CustServiceImpl

 

package cn.itheima.service;import cn.itheima.bean.Cust;import cn.itheima.dao.CustDao;import cn.itheima.factory.PubFactory;public class CustServiceImpl implements Custservice {CustDao dao=PubFactory.getFactory().createInstance("dao", CustDao.class);public void addUser(Cust cust) {// TODO Auto-generated method stub}}

3,创建工厂

 

  package cn.itheima.factory;    import java.io.File;  import java.io.FileInputStream;  import java.util.Properties;    public class PubFactory {  //私有化实例工厂对象,使外界不能直接调用  private static PubFactory factory=new PubFactory();  //声明一个Properties类对象  private static Properties prop;  //构造方法私有化,使外界不能直接创建工厂  private  PubFactory(){}  //静态代码块,类加载就执行,读取配置文件  static {  try{  //类加载器方式获得配置文件绝对路径  String path=PubFactory.class.getClassLoader().getResource("config.properties").getPath();  File file=new File(path);  prop=new Properties();  //创建Properties对象  prop.load(new FileInputStream(file));//加载配置文件    }catch (Exception e) {  e.printStackTrace();  }  }    public static PubFactory getFactory(){  return factory;  }  public <E> E createInstance(String name,Class<E> c){  try{  /*Class<E> x = (Class<E>) Class.forName(prop.getProperty(name));  return x.newInstance();*/  /*prop.getProperty(name)获取配置文件中name对应的字符串   * 比如传入的是dao,那就读取到cn.itheima.dao.CustDaoImpl    * 根据这个类名,就能创建这个类对应的字节码文件,也就是一个类。   *    * 利用泛型技术,第二个参数是一个<E>类型的字节码,作用是限定返回值得对象的类型   * */  Class clazz=Class.forName(prop.getProperty(name));  //根据clazz类,创建对象  return (E)clazz.newInstance();  }catch (Exception e) {  e.printStackTrace();  throw new RuntimeException();  }  }  }

4,使用工厂

 

Custservice service=PubFactory.getFactory().createInstance("service", Custservice.class);

//创建实现了Custservice 接口的CustServiceImpl类的一个对象

这样极大的降低了软件各层之间的耦合性。比如我在service层,需要调用dao层的对象,如果不用工厂,直接写死在service层里,那么将来做维护或者二次开发的时候,如果想换掉dao层该对象,那么就需要在service层里进行修改,很麻烦。而用了工厂模式,只需要创建好新的dao层的类,实现dao层接口,然后在配置文件里把dao行更改就行了。

原创粉丝点击