java 耦合解耦_为什么工厂模式可以解耦?why?
我们新建一个工厂,称为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.聊聊解耦? 耦合:代码之间的关联关系称为耦合,具有强关联关系的称为强耦合. 解耦:解除代码之间的关联关系,使每个业务代码职责单一,目的明确,通常我们在业务上称为解耦. 2.代码示例 我们以传统的E ...
- 解耦java_工厂模式实现解耦
解耦的含义 解耦的含义:降低程序之间的依赖性. 在实际开发中,应该做到编译期不依赖,运行时才依赖. 需求 我们有两个类UserService和UserDao,我们想实现UserService调用Use ...
- JAVA设计模式之3种工厂模式
转自 JAVA设计模式之3种工厂模式 创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离.为了使软件的结构更加清晰,外 ...
- Java设计模式(1)工厂模式(Factory模式)
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
- JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点
各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是 设计模式的一类:对于设计模式这个概 ...
- java 工厂模式 计算器_简单工厂模式实现简易计算器
packageFactoryMethodPattern;/*创建人:czc 创建时间:2019/12/16 创建用途:简单工厂模式实现计算器--主界面*/ import javax.swing.*;i ...
- java 工厂模式的写法_设计模式-工厂模式
一.概述 什么是工厂模式? 工厂模式(Factory Pattern)是最常见的一种设计模式之一.它主要是提供一种创建对象的最佳方法! 为什么要学习工厂模式? 与通过new来创建对象不同,使用工厂模式 ...
- java工厂模式式代码_简单工厂模式及其简单Java案例代码实现
说明:本文是<大话设计模式>的学习记录及结合网上相关信息编写,原书代码例子采用C#编写,本文采用Java稍加改写.若有不当,欢迎指正,共同进步.java 1.简单工厂模式概述:设计模式 简 ...
- java 工厂模式优点_抽象工厂模式的优缺点和适用场景
抽象工厂模式的优点 抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束.所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系 ...
最新文章
- 4.Spring Security 添加图形验证码
- linux:ls -l详解
- c++ long 转 short_C精品编程之——C语言的数据类型、运算符、表达式,精品课程...
- java多线程中出现的异常分别有哪些_java多线程试题
- cat6 万兆_cat6 万兆
- 面试官:简单说说Java8中的HashMap到底有啥变化?
- git 还原到某个版本_Git常用命令
- mybatis的二表联合查询
- 银河麒麟桌面操作系统中获取硬盘序列号
- 汽车零部件开发的流程及项目管理--陈新春老师
- 初识Kinect之二
- spring项目接入flyway(一) 背景、快速入门
- ZOJ 1428 Magazine Delivery
- Nginx 静态压缩/缓存
- 设计模式——简单工厂模式之女娲造人
- 电脑上删除的文件怎么恢复?
- mysql中vlookup函数_VLOOKUP函数的使用方法(入门级)
- CSS单行/多行文本溢出显示省略号(...)
- Elastic Stack(ELK6.6.2)安装及使用
- IntelliJ IDEA远程调试设置
热门文章
- mysql duplicate id_mysql 使用ON DUPLICATE KEY UPDATE 时导致的自增主键id无限增大问题
- git推送代码的命令详解
- php抽奖设置数量,php实现自定义中奖项数和概率的抽奖函数示例
- LeetCode 392 判断子序列
- FFmpeg源代码结构图 - 编码
- AAC规格(LC,HE,HEv2)及性能对比
- java jhap_Java-Live与JVAP工具的Max
- php编写九九乘法表隔行换色,JavaScript实现99乘法表及隔行变色实例代码
- 【服务器】宝塔部署eoLinker开源版
- 【NOIP1997】【Luogu1548】棋盘问题(枚举正方形个数)