使用工厂模式解耦和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的超简版实现
一.什么是简单工厂模式 设计模式的核心是“分工”,通过分工将对象与职责划分的更细化,进而提升系统设计的可扩展性,使其更容易维护. 开闭原则:对扩展开放,对修改关闭:要增加一个新的处理逻辑,可以开一个新 ...
随机推荐
- JS——函数
一.函数的种类 1.无参函数 function showName() { alert("我是无参函数"); } 2.有参函数 在函数中的参数为"形式参数" 形式 ...
- Apache下载、安装及配置(Windows版)
一.Apache的下载 1.点击链接http://httpd.apache.org/download.cgi,找到所需版本,如下图位置: 2.点击所需版本,选择Windows文件格式,如下图位置: 3 ...
- Urllib库的使用
一.任务描述 本实验任务主要对urllib库进行一些基本操作,通过完成本实验任务,要求学生熟练掌握urllib库的使用,并对urllib库的基本操作进行整理并填写工作任务报告. 二.任务目标 1. ...
- PAT1040:Longest Symmetric String
1040. Longest Symmetric String (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, ...
- 【原】用Java编写第一个区块链(一)
写这篇随笔主要是尝试帮助自己了解如何学习区块链技术开发. [本文禁止任何形式的全文粘贴式转载,本文来自 zacky31 的随笔] 目标: 创建一个最基本的"区块链" 实现一个简单的 ...
- GMT与Etc/GMT地区信息的时区转换
GMT 地区信息的时区 在将来的版本中可能不再支持以下左面一列中的地区信息的时区.可能从 /usr/share/lib/zoneinfo 删除这些文件.左列中的地区信息的时区用右列中对等的时区来替换. ...
- python 3 中的raw_input 报错
raw_input() was renamed to input()
- 你不知道的JavaScript--Item26 异步的脚本加载
先来看这行代码: <script src = "allMyClientSideCode.js"></script> 这有点儿--不怎么样."这该放 ...
- java.lang.OutOfMemoryError: PermGen space 解决办法
最近在学习spring mvc时,用了大量的第三方jar包,导致启动tomcat时报内存溢出的错 java.lang.OutOfMemoryError: PermGen space 解决办法:在mye ...
- Python爬虫利器五之Selenium的用法
1.简介 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的 ...