本文所使用的工具是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 stub
		return 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行更改就行了。