使用工厂模式解耦。

一、需求场景:

某一层功能需要改动,但其他层代码不变

  • 实现类1:MyDaoImpl查询自己的数据库.

    改为>

  • 实现类2:MyDaoImpl2从其它地址得到数据.

二、步骤:

1.创建一个BeanFactory类,Bean工厂

  1. service层:
  2. private MyDao dao = BeanFactory.getBean();
  3. class BeanFactory{
  4. public static Object getBean(){
  5. Class clazz = Class.forName("com.mysite.dao.impl.MyDaoImpl");//有硬编码问题
  6. Object obj =clazz,newInstance();
  7. return obj;
  8. }
  9. }

2.解决硬编码问题,进一步优化解耦

  • 提供一个配置文件:beans.properties

  • 内容:myDao=com.mysite.dao.impl.MyDaoImpl2

  1. //解决硬编码问题,进一步解耦
  2. service
  3. private MyDao dao = BeanFactory.getBean("myDao");
  4. class BeanFactory{
  5. public static Object getBean(String key){
  6. //读取beans.properties文件,得到Properties properties;
  7. Properties properties = BeanFactory.class.
  8. String clazzName = properties.getProperty(key);
  9. Class clazz = Class.forName(clazzName);
  10. Object obj = clazz.newInstance();
  11. }
  12. }

三、理论

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思想的更多相关文章

  1. Java工厂模式解耦 —— 理解Spring IOC

    Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...

  2. 阶段3 2.Spring_02.程序间耦合_6 工厂模式解耦

    使用类加载器去加载文件 定义getBean的方法 运行测试方法报错. 在工厂类里面打印输出BeanPath 删除dao的实现类 没有dao的实现类.再次运行程序.编译不报错.运行时报错 以上就是工厂模 ...

  3. GenericFactoryMethod泛型工厂模式实现简单IOC功能

    1.简介 泛型工厂理论上不算Gof23中设计模式之一,但是也算是一种非常好的设计模式,个人认为,废话不多说,先写个简单的抽象工厂,在写一个泛型工厂的例子来比较抽象和泛型的区别. 2.实战 还是房屋和道 ...

  4. spring自定义bean工厂模式解耦

    在resources下创建bean.properties accountService=cn.flypig666.service.impl.AccountServiceImpl accountDao= ...

  5. 阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版

    遍历枚举 改造获取的方法,这样获取的对象就是单例模式 再次运行测试程序 对象只有一个实例的情况下对i这个值进行了反复的操作.当多个人活着多线程在使用时.这就会出现类成员变量由于第一个人的修改.后面看到 ...

  6. IOC的实现原理—反射与工厂模式的结合

    反射机制概念   我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?再考虑另一个场景,如果我们想要在运行期获得某个类的Class信息如它的属性.构造方法.一般方 ...

  7. 创建型模式篇(工厂模式Factory Pattern)

    一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...

  8. java 之 工厂模式(大话设计模式)

    在以前的文章里面讲述过简单工厂模式,见链接:http://www.cnblogs.com/zhuxiansheng/p/7873161.html 简单工厂模式解耦了客户端和实现的依赖,不过如果有再次扩 ...

  9. 【Spring源码解析】—— 简单工厂模式的BeanFactory的超简版实现

    一.什么是简单工厂模式 设计模式的核心是“分工”,通过分工将对象与职责划分的更细化,进而提升系统设计的可扩展性,使其更容易维护. 开闭原则:对扩展开放,对修改关闭:要增加一个新的处理逻辑,可以开一个新 ...

随机推荐

  1. Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载) 业务需求: 对于一个B2B的生鲜电商平台,对于买家而言,他需要更加快速的购买到自己的产品,跟自己的餐饮店不相关的东西,他是不关心的,而 ...

  2. Spring+Mybatis多数据源的一种实现方式,支持事务

    最近一个项目用到了多个数据库,所以需要实现动态切换数据源来查询数据,http://www.cnblogs.com/lzrabbit/p/3750803.html这篇文章让我受益匪浅,提供了一种自动切换 ...

  3. [ Java面试题 ]泛型篇

    1.Java中的泛型是什么 ? 使用泛型的好处是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 好处: 1.类型安全,提供编译期间的类 ...

  4. 在Python中用Request库模拟登录(一):字幕库(无加密,无验证码)

    字幕库的登录表单如下所示,其中省去了无关紧要的内容: <form class="login-form" action="/User/login.html" ...

  5. oracle中数据类型对应java类型

    地址: http://otndnld.Oracle.co.jp/document/products/oracle10g/102/doc_cd/Java.102/B19275-03/datacc.htm ...

  6. Inception体验之安装

    Inception介绍 MySQL Inception是数据库管理员的工具.它允许DBA构建好的SQL语句,在只读数据集上测试它们,并最终针对生产数据库运行这些SQL语句,并且能够在SQL语句出于某种 ...

  7. index.go

    package types type DocumentIndex struct {     // 文本的DocId     DocId uint64     // 文本的关键词长     TokenL ...

  8. google cache源码详解

    一.引子 缓存有很多种解决方案,常见的是: 1.存储在内存中 : 内存缓存顾名思义直接存储在JVM内存中,JVM宕机那么内存丢失,读写速度快,但受内存大小的限制,且有丢失数据风险. 2.存储在磁盘中: ...

  9. BZOJ_1408_[Noi2002]Robot_数学

    Description Input Output Sample Input 3 2 1 3 2 5 1 Sample Output 8 6 75 HINT 90号机器人有10个老师,加上它自己共11个 ...

  10. luoguP4231_三步必杀_差分

    luoguP4231_三步必杀_差分 题意:N 个柱子排成一排,一开始每个柱子损伤度为0.接下来勇仪会进行M 次攻击,每次攻击可以用4个参数l,r ,s ,e 来描述: 表示这次攻击作用范围为第l个到 ...