通过工厂模式解耦

工厂模式解耦

  • 通过一个配置文件配置我们的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);

    }

}
posted @ 2020-04-05 12:55  whblog  阅读(409)  评论(0)    收藏  举报