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");
    }
}

但是这样不仅数据访问层需要更改,业务层也需要更改,即:

private UserDao userDao = new UserDaoFile;

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

利用工厂方法来实现上述目标:
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的两层代码无需发生任何改变。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值