我们新建一个工厂,称为BeanFactory

/**

* 定义一个bean工厂,专门生产普通对象

*/

public class BeanFactory {

public static UserDao getBean() {

return new UserDaoMysqlImpl();

}

}

然后我们要对耦合的那一层修改,目前看是把service解耦了吧?我所有创建对象的操作,都在一个具体的工厂类里;

public class UserServiceImpl implements UserService {

//业务层调用数据dao层,这里不解释了

// private UserDao userDao = new UserDaoMysqlImpl();

// private UserDao userDao = new UserDaoOracleImpl();

private UserDao userDao = BeanFactory.getBean();

public void save() {

userDao.save();

}

}

很明显,我已经进行了service和dao解耦;但是!!!!!!

该死的需求是:我要改成oracle,sqlserver,......

那我们继续:我顺便把之前的getBean换成了mysql的

public class UserServiceImpl implements UserService {

//业务层调用数据dao层,这里不解释了

// private UserDao userDao = new UserDaoMysqlImpl();

// private UserDao userDao = new UserDaoOracleImpl();

// private UserDao userDao = BeanFactory.getMysqlBean();

private UserDao userDao = BeanFactory.getOracleBean();

@Override

public void save() {

userDao.save();

}

}

很明显我现在已经把dao和service的耦合,转移到了工厂和service上了,这就是解耦的一步;但是大家还是疑惑,我感觉我代码增多了?或者更麻烦了?我们继续看

我们每次增加新的业务,扩展,都要修改工厂,所以这个我们可以不可以不在代码里直接做这个事情?--------引出配置文件

我们在resources下定义一个applicationContext.properties

userDao=com.chenxin.gmall.user.demo.dao.UserDaoMysqlImpl

userService=com.chenxin.gmall.user.demo.service.UserServiceImpl

如果我们需要换成oracle,我们只改这个配置文件,改成UserDaoOracleImpl,不需要去动代码

那我们刚刚的BeanFactory就又可以通过读取配置文件的方式,用反射来创建对象,反射创建对象是根据对象的全类名做的,不是直接new,看看效果

/**

* 定义一个bean工厂,专门生产普通对象

*/

public class BeanFactory {

private static Properties properties = new Properties();

//1.加载配置文件

static {

InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");

try {

properties.load(resourceAsStream);

resourceAsStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

// public static UserDao getMysqlBean() {

// return new UserDaoMysqlImpl();

// }

//

// public static UserDao getOracleBean() {

// return new UserDaoOracleImpl();

// }

public static UserDao getBean(String key){

// 2.使用key获得value

String className = properties.getProperty(key);

// 3.使用value利用反射技术创建对象

try{

return (UserDao) Class.forName(className).newInstance();

}catch(Exception e){

e.printStackTrace();

return null;

}

}

}

好了,我们来需求,我们要保存到oracle,sqlserver数据库,看看你是不是只需要多一个dao的oracle实现,然后去改配置文件就ok?多一个sqlserver后,改下applicationContext.properties

算了我直接写个代码吧:

/**

* 新增了sqlserver的支持,多态的表现

*/

public class UserDaoSqlServerImpl implements UserDao {

@Override

public void save() {

System.out.println("保存SqlServer数据库成功!");

}

}

改下applicationContext.properties

userDao=com.chenxin.gmall.user.demo.dao.UserDaoSqlServerImpl

userService=com.chenxin.gmall.user.demo.service.UserServiceImpl

你可以试一下,是不是这么干的!

java 耦合解耦_为什么工厂模式可以解耦?why?相关推荐

  1. 为什么工厂模式可以解耦?(一)

    1.聊聊解耦? 耦合:代码之间的关联关系称为耦合,具有强关联关系的称为强耦合. 解耦:解除代码之间的关联关系,使每个业务代码职责单一,目的明确,通常我们在业务上称为解耦. 2.代码示例 我们以传统的E ...

  2. 解耦java_工厂模式实现解耦

    解耦的含义 解耦的含义:降低程序之间的依赖性. 在实际开发中,应该做到编译期不依赖,运行时才依赖. 需求 我们有两个类UserService和UserDao,我们想实现UserService调用Use ...

  3. JAVA设计模式之3种工厂模式

    转自 JAVA设计模式之3种工厂模式 创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离.为了使软件的结构更加清晰,外 ...

  4. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  5. JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

    各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是 设计模式的一类:对于设计模式这个概 ...

  6. java 工厂模式 计算器_简单工厂模式实现简易计算器

    packageFactoryMethodPattern;/*创建人:czc 创建时间:2019/12/16 创建用途:简单工厂模式实现计算器--主界面*/ import javax.swing.*;i ...

  7. java 工厂模式的写法_设计模式-工厂模式

    一.概述 什么是工厂模式? 工厂模式(Factory Pattern)是最常见的一种设计模式之一.它主要是提供一种创建对象的最佳方法! 为什么要学习工厂模式? 与通过new来创建对象不同,使用工厂模式 ...

  8. java工厂模式式代码_简单工厂模式及其简单Java案例代码实现

    说明:本文是<大话设计模式>的学习记录及结合网上相关信息编写,原书代码例子采用C#编写,本文采用Java稍加改写.若有不当,欢迎指正,共同进步.java 1.简单工厂模式概述:设计模式 简 ...

  9. java 工厂模式优点_抽象工厂模式的优缺点和适用场景

    抽象工厂模式的优点 抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束.所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系 ...

最新文章

  1. 4.Spring Security 添加图形验证码
  2. linux:ls -l详解
  3. c++ long 转 short_C精品编程之——C语言的数据类型、运算符、表达式,精品课程...
  4. java多线程中出现的异常分别有哪些_java多线程试题
  5. cat6 万兆_cat6 万兆
  6. 面试官:简单说说Java8中的HashMap到底有啥变化?
  7. git 还原到某个版本_Git常用命令
  8. mybatis的二表联合查询
  9. 银河麒麟桌面操作系统中获取硬盘序列号
  10. 汽车零部件开发的流程及项目管理--陈新春老师
  11. 初识Kinect之二
  12. spring项目接入flyway(一) 背景、快速入门
  13. ZOJ 1428 Magazine Delivery
  14. Nginx 静态压缩/缓存
  15. 设计模式——简单工厂模式之女娲造人
  16. 电脑上删除的文件怎么恢复?
  17. mysql中vlookup函数_VLOOKUP函数的使用方法(入门级)
  18. CSS单行/多行文本溢出显示省略号(...)
  19. Elastic Stack(ELK6.6.2)安装及使用
  20. IntelliJ IDEA远程调试设置

热门文章

  1. mysql duplicate id_mysql 使用ON DUPLICATE KEY UPDATE 时导致的自增主键id无限增大问题
  2. git推送代码的命令详解
  3. php抽奖设置数量,php实现自定义中奖项数和概率的抽奖函数示例
  4. LeetCode 392 判断子序列
  5. FFmpeg源代码结构图 - 编码
  6. AAC规格(LC,HE,HEv2)及性能对比
  7. java jhap_Java-Live与JVAP工具的Max
  8. php编写九九乘法表隔行换色,JavaScript实现99乘法表及隔行变色实例代码
  9. 【服务器】宝塔部署eoLinker开源版
  10. 【NOIP1997】【Luogu1548】棋盘问题(枚举正方形个数)