通过工厂模式解耦
工厂模式解耦
-
通过一个配置文件配置我们的service和dao
配置文件内容: 唯一标识=全限定类名(key=value)
-
通过读取配置文件内容,反射创建对象
1.1 将对象全限定类名配置到文件中
userDao=com.heng.dao.impl.UserDaoImpl
userService=com.heng.service.impl.UserService
1.2 编写工厂方法,将配置的对象加载到内存
读取配置文件,获取全限定类型,通过反射方式创建对象
package com.heng.factory;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
*
*/
public class BeanFactory {
private static Properties properties;
private static Map<String, Object> beanFactory;
static {
try {
properties = new Properties();
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
properties.load(in);
// 实例化Object
beanFactory = new HashMap<String, Object>();
Enumeration keys = properties.keys();
while (keys.hasMoreElements()) {
String key = keys.nextElement().toString();
// 获取对象全限定类型
String beanPath = properties.getProperty(key);
// 通过反射方式获取对象
Object obj = Class.forName(beanPath).getDeclaredConstructor().newInstance();
beanFactory.put(key, obj);
}
} catch (IOException | ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}
}
public static Object getDao(String name) {
return beanFactory.get(name);
}
}
1.3 创建bean对象
package com.heng.bean;
public class UserBean {
private String name;
private int age;
public String getName() {....}
public void setName(String name) {....}
public int getAge() {.....}
public void setAge(int age) {....}
@Override
public String toString() {
return "UserBean{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
1.4 创建数据访问层
dao接口
package com.heng.dao;
import com.heng.bean.UserBean;
public interface IUserDao {
public boolean createUser(UserBean user);
}
dao实现类
package com.heng.dao.impl;
import com.heng.bean.UserBean;
import com.heng.dao.IUserDao;
public class UserDaoImpl implements IUserDao {
@Override
public boolean createUser(UserBean userBean) {
System.out.println("创建了一个用户:" + userBean);
return true;
}
}
1.5创建业务层
package com.heng.service;
import com.heng.bean.UserBean;
public interface IUserService {
public boolean createUser(UserBean user);
}
package com.heng.service.impl;
import com.heng.bean.UserBean;
import com.heng.dao.IUserDao;
import com.heng.factory.BeanFactory;
import com.heng.service.IUserService;
public class UserService implements IUserService {
// 通过工厂获取dao
IUserDao userDao = (IUserDao) BeanFactory.getDao("userDao");
@Override
public boolean createUser(UserBean user) {
return userDao.createUser(user);
}
}
1.6测试
package test;
import com.heng.bean.UserBean;
import com.heng.factory.BeanFactory;
import com.heng.service.IUserService;
public class Test {
public static void main(String[] args) {
IUserService userService = (IUserService) BeanFactory.getDao("userService");
UserBean user = new UserBean();
user.setName("test");
user.setAge(1);
userService.createUser(user);
}
}

浙公网安备 33010602011771号