工厂模式设计IOC容器


IOC容器的底层实现其实就是利用工厂设计模式。接下来我们通过工厂设计模式模拟一个小型的IOC容器,让大家对IOC的底层原理更加清晰些。

一、搭建案例程序

1)CustomerDao接口:

package com.yiidian.dao;public interface CustomerDao {public void save();}

2)CustomerDaoMySQLImpl:(模拟MySQL版本的Dao实现)

package com.yiidian.dao.impl;import com.yiidian.dao.CustomerDao;
/*** * @author http://www.yiidian.com**/
public class CustomerDaoMySQLImpl implements CustomerDao {@Overridepublic void save() {System.out.println("把客户数据保存到mysql数据");}}

3)CustomerService接口:

package com.yiidian.service;
/*** * @author http://www.yiidian.com**/
public interface CustomerService {public void save();
}

4)CustomerServiceImpl实现类:

package com.yiidian.service.impl;import com.yiidian.dao.CustomerDao;
import com.yiidian.dao.impl.CustomerDaoImpl;
import com.yiidian.service.CustomerService;
/*** * @author http://www.yiidian.com**/
public class CustomerServiceImpl implements CustomerService {//1.传统方法,直接new对象.private CustomerDao customerDao = new CustomerDaoImpl();@Overridepublic void save() {customerDao.save();}}

5)ActionDemo类(模拟Struts2的Action):

package com.yiidian.web;import com.yiidian.service.CustomerService;
import com.yiidian.service.impl.CustomerServiceImpl;
/*** * @author http://www.yiidian.com**/
public class ActionDemo {public static void main(String[] args) {//传统方式调用业务,直接new对象CustomerService customerService = new CustomerServiceImpl();customerService.save();}
}

6)运行ActionDemo的main方法,执行结果为:

二、扩展程序,发现问题

1)给CustomerDao接口添加多一个实现类,CustomerDaoOracleImpl(模拟Oracle的Dao实现):

package com.yiidian.dao.impl;import com.yiidian.dao.CustomerDao;
/*** * @author http://www.yiidian.com**/
public class CustomerDaoOracleImpl implements CustomerDao {@Overridepublic void save() {System.out.println("保存客户数据保存Oracle");}}

2)这时我们需要在CustomerServiceImpl类中调用CustomerDaoOracleImpl的方法,需要手动修改代码实现:

package com.yiidian.service.impl;import com.yiidian.dao.CustomerDao;
import com.yiidian.dao.impl.CustomerDaoOracleImpl;
import com.yiidian.service.CustomerService;
/*** * @author http://www.yiidian.com**/
public class CustomerServiceImpl implements CustomerService {//1.传统方法,直接new对象.//private CustomerDao customerDao = new CustomerDaoMySQLImpl();private CustomerDao customerDao = new CustomerDaoOracleImpl(); //(弊端:耦合性太高,修改源代码)@Overridepublic void save() {customerDao.save();}}

3)运行ActionDemo,查看结果:

总结问题:我们每次为CustomerDao接口扩展了实现类,业务层需要修改代码才可以实现切换具体的实现类,这种做法为“硬编码”方式,扩展性不好!接下来开始引用工厂设计模式改造程序。

三、利用工厂设计模式,改造程序

1)编写一个BeanFactory类,用于读取配置文件,创建程序需要的对象:

package com.yiidian.ioc;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;/*** 创建对象的工厂(模拟简单IOC容器)* @author http://www.yiidian.com**/
public class BeanFactory {/*** 初始化beans.properties文件*/private static Properties props = new Properties();static{InputStream in = BeanFactory.class.getResourceAsStream("/beans.properties");try {props.load(in);} catch (IOException e) {e.printStackTrace();System.out.println("加载beans.properties文件失败");}}/*** 从工厂获取一个对象* @return*/public static Object getBean(String name){//根据name创建不同的对象//1.通过name在properties文件找到类名称String className = props.getProperty(name);//2.通过反射构造类的对象try {return Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();}return null;}
}

2)在src目录编写beans.properties配置文件:

beans.properties:

customerDao=com.yiidian.dao.impl.CustomerDaoMySQLImpl

3)改造CustomerServiceImpl类:

/*** * @author http://www.yiidian.com**/
public class CustomerServiceImpl implements CustomerService {//1.传统方法,直接new对象.//private CustomerDao customerDao = new CustomerDaoMySQLImpl();//private CustomerDao customerDao = new CustomerDaoOracleImpl(); //(弊端:耦合性太高,修改源代码)//2.IOC容器private CustomerDao customerDao = (CustomerDao) BeanFactory.getBean("customerDao");@Overridepublic void save() {customerDao.save();}}

4)运行ActionDemo,这时可以调用Dao程序,这时如果需求切换到CustomerDaoOracleImpl,只需要修改beans.properties,改为:

customerDao=com.yiidian.dao.impl.CustomerDaoOracleImpl

再次运行ActionDemo,可以看到已经成功切换到Oracle的Dao实现啦!

到此为止,BeanFactory就是一个小型的IOC容器,可以创建我们程序中需要的一些对象。事实上,Spring的IOC容器的底层就是类似BeanFactory的原理

源码下载: http://pan.baidu.com/s/1geJrQCF

Spring4.x(3)---工厂模式设计IOC容器相关推荐

  1. Java:利用工厂模式设计加减乘除功能的计算器

    使用简单工厂模式开发一个包含加减乘除功能的计算器. 思路如下: 1.构造一个计算器抽象类:属性:含有两个参与计算的数字:方法:获取返回计算结果. 2.创建加法.减法.乘法.除法功能子类,继承计算器,在 ...

  2. 二、工厂模式——在工厂里能找到你的对象

    文章目录 工厂模式 1. 简单工厂 2. 缓存方式 3. 工厂模式 4. 工厂的工厂 5. 抽象工厂 6. 工厂模式与IOC容器 总结 设计模式是面向问题.场景而总结产生的设计思路.是解决问题的套路. ...

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

    工厂模式 前言 一.简单工厂模式 二.工厂方法模式 优点: 缺点: 三.工厂方法模式适合应用场景 总结 前言 核心本质: 1.实例化对象不使用new,用工厂方法代替, 2.将选择实现类,创建对象统一管 ...

  4. Unity实现IOC容器

    测试代码链接 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency ...

  5. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  6. java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现

    工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...

  7. Spring框架学习[IoC容器高级特性]

    1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...

  8. IOC 容器中那些鲜为人知的细节(关于 FactoryBean 和 BeanFactory)

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 在 Spring 中,有两个很容易混淆的类:BeanFactory 和 FactoryBean. BeanFa ...

  9. Java工厂模式(随笔)

    目录 前言 一.三大工厂模式以及特殊工厂模式介绍 1.简单工厂模式简介(Simple Factory Pattern) 2.工厂模式简介   (Factory Pattern) 3.抽象工厂模式简介 ...

最新文章

  1. linux信号使用,linux信号使用注意事项
  2. C++两个整数的总和是否为整数溢出的算法实现(附完整源码)
  3. 8.1 文件查找local;find使用
  4. python dict底层实现_dict实现原理和哈希表
  5. mysql5.6触发器,MYSQL5.6创建存储过程和触发器
  6. Java程序员的日常
  7. go 计算文件sha-256_Kubernetes入门实践--部署运行Go项目
  8. (转)服务器控件三个ID
  9. 论文用impact、effect、influence 什么区别
  10. 三维空间中的Pitch、Yaw、Roll值
  11. C++程序设计一、二(二元一次方程与函数、函数指针)
  12. UE4读取scv文件 -- 数据驱动游戏性元素
  13. 服务器日志默认存放位置,系统日志和IIS日志存放路径
  14. 百度图像识别明星或动物
  15. jupyter无法重命名,文件不可信,后台被自动关闭
  16. DTL相关知识整理初稿
  17. 苹果自带相册打马赛克_科普 | 谨慎使用苹果自带的笔打码订单哦!
  18. 华为使用计算机投屏要打开什么,华为手机怎么投屏到电脑?这些小屏变大屏的操作你会吗...
  19. Python Set 与 dict
  20. 我的Lenovo ThinkPad R60e 键盘按键失灵!

热门文章

  1. c语言的局部指针,C中局部变量指针问题
  2. 【Shell教程】四----输入输出,条件判断,循环
  3. ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)
  4. 带你一文看懂--应用层、传输层的协议,HTTP协议及实现,UDP和TCP的报文格式以及为什么3次握手和4次挥手
  5. 卸载centos7自带mysql_centos7完全卸载mysql
  6. HttpClient调用http接口(POST)
  7. 原生javascript添加和删除class
  8. CSS设置背景透明字体不透明
  9. 取两堆石子(威佐夫博弈)
  10. git 空提交和重置提交者(转载)