本文所使用的工具是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();
}
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);
}
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;
}
}
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
}
}
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();
}
}
}
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行更改就行了。
Custservice service=PubFactory.getFactory().createInstance("service", Custservice.class);
//创建实现了Custservice 接口的CustServiceImpl类的一个对象
这样极大的降低了软件各层之间的耦合性。比如我在service层,需要调用dao层的对象,如果不用工厂,直接写死在service层里,那么将来做维护或者二次开发的时候,如果想换掉dao层该对象,那么就需要在service层里进行修改,很麻烦。而用了工厂模式,只需要创建好新的dao层的类,实现dao层接口,然后在配置文件里把dao行更改就行了。