工厂模式解耦案例
解耦方式:工厂+配置文件+接口
package com.ermao.dao;
//员工模块dao层接口
public interface EmpDao {
public void addEmp();
}
package com.ermao.dao;
//员工模块dao层实现类
public class EmpDaoImpl implements EmpDao {
public void addEmp() {}
}
package com.ermao.service;
//员工模块service层接口
public interface EmpService {
public void addEmp();
}
package com.ermao.service;
import com.ermao.dao.EmpDao;
import com.ermao.dao.EmpDaoImpl;
import com.ermao.factory.BeanFactory;
//员工模块service层实现类
public class EmpServiceImpl implements EmpService{
// private EmpDao dao = new EmpDaoImpl();
// 获取Dao接口的子类实例,这里使用new对象的方式造成了程序之间的耦合性提升
private EmpDao dao = (EmpDao) BeanFactory.getBean( "EmpDao" );
public void addEmp() {
System.out.println("调用dao层的方法添加员工信息...");
dao.addEmp();
}
}
package com.ermao.controller;
import com.ermao.factory.BeanFactory;
import com.ermao.service.EmpService;
import com.ermao.service.EmpServiceImpl;
import org.junit.Test;
//模拟表现层
public class EmpController {
// private EmpService service = new EmpServiceImpl();
// 获取Dao接口的子类实例,这里使用new对象的方式造成了程序之间的耦合性提升
private EmpService service = (EmpService) BeanFactory.getBean("EmpService");
@Test
public void testAddEmp() {
System.out.println("调用service层的方法添加员工信息..."); service.addEmp();
}
}
工厂类
package com.ermao.factory;
import java.io.InputStream;
import java.util.Properties;
public class BeanFactory {
//声明一个Properties对象,在静态代码块中对其进行初始化
private static Properties prop;
static {
try {
//为prop进行实例化
prop = new Properties();
//获取配置文件的流对象
InputStream in = BeanFactory.class.getClassLoader()
.getResourceAsStream("config.properties");
//将配置文件中的内容读取到Properties对象中
prop.load( in );
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("初始化Properties对象失败!");
}
}
/**
* 根据config.xml文件中的key获取对应class类的实例
* @param key
* @return
*/
public static Object getBean(String key) {
Object bean = null;
try {
String className = prop.getProperty( key );
bean = Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
resources配置文件
EmpService=com.ermao.service.EmpServiceImpl
EmpDao=com.ermao.dao.EmpDaoImpl