使用工厂模式解耦和IoC思想
使用工厂模式解耦。
一、需求场景:
某一层功能需要改动,但其他层代码不变
实现类1:
MyDaoImpl查询自己的数据库.改为>
实现类2:
MyDaoImpl2从其它地址得到数据.
二、步骤:
1.创建一个BeanFactory类,Bean工厂
service层:
private MyDao dao = BeanFactory.getBean();
class BeanFactory{
public static Object getBean(){
Class clazz = Class.forName("com.mysite.dao.impl.MyDaoImpl");//有硬编码问题
Object obj =clazz,newInstance();
return obj;
}
}
2.解决硬编码问题,进一步优化解耦
提供一个配置文件:
beans.properties内容:
myDao=com.mysite.dao.impl.MyDaoImpl2
//解决硬编码问题,进一步解耦
service层
private MyDao dao = BeanFactory.getBean("myDao");
class BeanFactory{
public static Object getBean(String key){
//读取beans.properties文件,得到Properties properties;
Properties properties = BeanFactory.class.
String clazzName = properties.getProperty(key);
Class clazz = Class.forName(clazzName);
Object obj = clazz.newInstance();
}
}
三、理论
1.导入-----使用接口开发:
- 好处:方便进行功能拓展,提供新的实现类,提供新功能
- 问题:service层里创建dao对象的代码需要随之调整
- 层与层之间耦合性比较强
2.解决思路:
- 在service层创建对象时,使用反射创建对象,
- 提供一个配置文件: key对应
dao的全限定类名 - 想创建什么
dao,就提供一个key,通过BeanFactory类得到key对应的dao对象. - 好处:
dao再拓展,又增加了新的实现类.我们只需要修改配置文件即可.- 其它service代码、
BeanFactory代码都不需要变更.
- 耦合性降低了
3.工厂模式
Spring框架的两大核心
IoC:Inversion of Control,控制反转,解耦
- 由原来主动创建对象,变成被动接收对象.把创建对象的控制权交出去了.
AOP: Aspect Oriented Programming,面向切面编程
使用工厂模式解耦和IoC思想的更多相关文章
- Java工厂模式解耦 —— 理解Spring IOC
Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...
- 阶段3 2.Spring_02.程序间耦合_6 工厂模式解耦
使用类加载器去加载文件 定义getBean的方法 运行测试方法报错. 在工厂类里面打印输出BeanPath 删除dao的实现类 没有dao的实现类.再次运行程序.编译不报错.运行时报错 以上就是工厂模 ...
- GenericFactoryMethod泛型工厂模式实现简单IOC功能
1.简介 泛型工厂理论上不算Gof23中设计模式之一,但是也算是一种非常好的设计模式,个人认为,废话不多说,先写个简单的抽象工厂,在写一个泛型工厂的例子来比较抽象和泛型的区别. 2.实战 还是房屋和道 ...
- spring自定义bean工厂模式解耦
在resources下创建bean.properties accountService=cn.flypig666.service.impl.AccountServiceImpl accountDao= ...
- 阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
遍历枚举 改造获取的方法,这样获取的对象就是单例模式 再次运行测试程序 对象只有一个实例的情况下对i这个值进行了反复的操作.当多个人活着多线程在使用时.这就会出现类成员变量由于第一个人的修改.后面看到 ...
- IOC的实现原理—反射与工厂模式的结合
反射机制概念 我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?再考虑另一个场景,如果我们想要在运行期获得某个类的Class信息如它的属性.构造方法.一般方 ...
- 创建型模式篇(工厂模式Factory Pattern)
一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...
- java 之 工厂模式(大话设计模式)
在以前的文章里面讲述过简单工厂模式,见链接:http://www.cnblogs.com/zhuxiansheng/p/7873161.html 简单工厂模式解耦了客户端和实现的依赖,不过如果有再次扩 ...
- 【Spring源码解析】—— 简单工厂模式的BeanFactory的超简版实现
一.什么是简单工厂模式 设计模式的核心是“分工”,通过分工将对象与职责划分的更细化,进而提升系统设计的可扩展性,使其更容易维护. 开闭原则:对扩展开放,对修改关闭:要增加一个新的处理逻辑,可以开一个新 ...
随机推荐
- python selenium鼠标键盘操作(ActionChains)
用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击.双击.点击鼠标右键.拖拽等等.而selenium给我们提供了一个类来处理这类事件--ActionChains sele ...
- Javassist字节码增强示例
概述 Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果.熟练使用这套工具,可以让Java编程更接近与动态语言编程. 下面一个方 ...
- Hibernate中的持久化类
一.持久化类概述 就是一个JavaBean,这个JavaBean与表建立了映射关系.这个类就称为是持久化类. 简单理解为 持久化类=JavaBean+映射文件. 持久化类:是指其实例需要被Hibern ...
- cmd命令行下登陆备份导入导出msql数据
1.进入服务,找到mysql服务,在属性里找到mysql的安装路径 2.登陆 mysql -h 192.168.0.11 -P 3310 -u root -p 如果是访问的本机并且端口是默认的,那么 ...
- 使用Eclipse打开已有工程
点击Eclipse界面中的file(文件)下的import(导入). 进入导入界面,选择General下的Exiting Project into Workspace. 点击Select ...
- c/c++(hiredis)异步调用redis【转】
hiredis是redis官方推荐的C/C++客户端代码库.使用hiredis库很简易方便的进行redis的相关开发. 同步方式 不过大多数情况下,我们采用的都是同步的调用方式. 1 2 3 4 ...
- Spring Boot中使用Actuator的/info端点输出Git版本信息
对于Spring Boot的Actuator模块相信大家已经不陌生了,尤其对于其中的/health./metrics等强大端点已经不陌生(如您还不了解Actuator模块,建议先阅读<Sprin ...
- Asp.net MVC + Redis(hash入库+log4net集成)
博客四元素 既然要写一个博客类的网站,那就应该知道博客的相关信息. 标题 作者 时间 内容 title author time content 因为之前有了解过Redis,所以有点纠结于数据的存储方式 ...
- Postman用法简介
转自:http://blog.csdn.net/flowerspring/article/details/52774399 Postman用法简介 转载 2016年10月10日 09:04:10 10 ...
- BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对
BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对 题意: 奶牛的图片 Farmer John希望给他的N(1<=N<=100,000)只奶牛拍照片, ...