Java利用工厂方法模式实现层与层之间的解耦合

Java在web开发中,遵循分层开发思想:


表现层(User Interface layer)

直接和用户见面,大部分跟界面的开发有关(html,jsp,servlet)

业务逻辑层(Business Logic Layer)

业务逻辑由一个到多个基本的增删改查组成

持久层(数据访问层)(Data access laye)

将数据永久的保存,jdbc与mybatis部分

我们希望在开发中层与层之间的耦合度尽可能的低,通俗的说就是代码与代码之间的依赖尽可能的低。

先看一个例子:

一段数据库插入与更新数据的简单代码,能说明问题即可:


package dao;
 //Dao与其实现类相当于持久层
interface UserDao {

    public void insert();

    public void update();

}

class UserDaoDatabase implements UserDao {
    public void insert() {
        System.out.println(" UserDaoDatabase 数据库的实现 insert");
    }

    public void update() {
        System.out.println(" UserDaoDatabase 数据库的实现 update");
    }
}
//UserService相当于业务逻辑层
class UserService { 

    private UserDao userDao = new UserDaoDatabase;

    public void service() {
        userDao.insert();
        userDao.update();
    }
}


简单模拟分层,这里倘若出现新的需求,不再需要将数据写入数据库,而是写入文件保存,那么加上如下代码


class UserDaoFile implements UserDao {
    public void insert() {
        System.out.println(" UserDaoDatabase 文件的实现 insert");
    }

    public void update() {
        System.out.println(" UserDaoDatabase 文件的实现 update");
    }
}


那么这样是十分麻烦的,因为只要数据访问层发生改变,那么业务层也会随之变化,因此需要降低这两层之间的耦合度

利用工厂方法来实现上述目标:


import dao.UserDao;
import java.io.FileInputStream;
import java.util.Properties;

// 用户dao 的工厂类, 负责创建 UserDao对象
public class UserDaoFactory {

    // 工厂方法模式 - factory-method 解耦了 service 和 dao 层
    // 1. 利用了接口
    // 2. 工厂方法
    // 3. 把变化的部分放入外部配置文件
    public static UserDao getUserDao() {
        try {
            Properties props = new Properties();
            props.load(new FileInputStream("config.properties"));
            System.out.println(props.get("dao.UserDao"));
            String className = props.getProperty("dao.UserDao");
            System.out.println(className);

            // 根据字符串类名,反射得到类对象
            Class c = Class.forName(className);
            // 根据类对象,创建新的实例对象
            UserDao userDao = (UserDao)c.newInstance();

            return userDao;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


这样,把需要变更的地方,放在一个外部的配置文件中,config.properties如下


dao.UserDao = dao.UserDaoFile/dao.UserDaodatebase


而业务层只需要如下更改:


private UserDao userDao = UserDaoFactory.getUserDao();


这样以后,当需求发生变更,只需要更改配置文件即可,从而降低耦合度,Java的两层代码无需发生任何改变。

上一篇:看山聊并发:Java 中 Vector 和 SynchronizedList 的区别


下一篇:面向接口编程的优点