控制反转(IoC) ? 工厂模式?

原创 2015年11月19日 10:47:10

                                      

         不知道大家还记不记得当年程杰的《大话设计模式》了,最近一直想搞明白控制反转到底是怎么回事,刚刚觉得高大上了一点,然后再进一步去学习去对比的时候才发现,以前早就接触过这类的思想,设计原则的依赖倒转和设计模式的工厂方法都很好的体现了这种思想,迫不及待的想要跟大家分享一下啦!

 

、依赖倒转原则


A.高层模块不应该依赖低层模块。两个都应该依赖于抽象。

B.抽象不应该依赖细节,细节应该依赖于抽象。说白了就是,要针对接口编程,不要对实现编程。

        在控制反转的原理中,我们了解到,我们将对象的实例化放到了容器中,在产品实现的时候,我们直接调用接口,即容器将其所依赖的对象的引用传递到产品代码中。IoC管理对象间的依赖关系,产品代码只需要针对接口编程,而不再依赖于具体实现。与依赖倒转原则如出一辙。

 

                           

、工厂方法模式


        定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法遵循开放-封闭原则,并且保持了封装对象创建过程的优点。

        我们可以把IoC模式看做是工厂模式的升华,把IoC看做是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

 

                   

 

、反射


        工厂方法也有缺点,就是每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。不知道大家还记不记得在书里,写工厂方法的那一章,在最后一段话中,给大家留下了一个伏笔——反射。

        在后面讲到抽象工厂的时候,就提到了依赖注入的名词。就拿抽象工厂来说,如果我们需要新增一个数据库类型,就需要在代码中添加一条分支条件,破坏了开闭原则,这个时候依赖注入本身是没有能力解决这个问题的,但是如果我们利用语言支持反射机制,利用反射配置数据源,就可以避免分支判断的问题。

        让我们想想,反射做了什么工作,我们工程一开始的难点出在对象最后都是需要new,实例化的,而我们只能实例化当前已有的类,不能对未来会添加的新类做处理,所以一旦有新的类加入,我们就必须修改代码。但是,如果我们有一种方法,不是通过new,而是通过类的名字来实例化对象,那么我只需要将类的名字作为配置项,就可以实现不修改代码的前提下加未来会出现的类。所以,我们可以毫不夸张的说,反射给了语言“预见未来”的能力,使得多态性和依赖注入的威力大增

 

四、结束语

 

          看了一大堆资料,把以前的设计模式也翻出来研究了一番,画画图,思路更加的清晰IoC感觉就像”抽象工厂+反射+配置文件“,如图,我们可以把AbstractFactory作为IoC容器,并且加入反射机制和配置文件,实现灵活配置类名。(解释,配置文件取代ConcreFactory1ConcreFactory2,具体用哪个,灵活配置类名即可;反射用在AbstractFactory里,取代分支判断,避免了后期扩展修改代码的弊病)

                                

 

         OK,面向对象无外乎那几个原则,大道至简的路,还很漫长,java的学习,才刚刚开始,加油吧!

版权声明:本文为博主原创文章,未经博主允许不得转载。

控制反转(IoC) ? 工厂模式?

不知道大家还记不记得当年程杰的《大话设计模式》了,最近一直想搞明白控制反转到底是怎么回事,刚刚觉得高大上了一点,然后再进一步去学习去对比的时候才发现,以前早就接触过这类的思想,设计原则的依赖倒转和设计...
  • caozhangyingfei0109
  • caozhangyingfei0109
  • 2015年03月10日 12:02
  • 1891

IOC的实现原理—反射与工厂模式

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

Spring框架中IoC(控制反转)的原理

一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,对...
  • u012561176
  • u012561176
  • 2015年05月26日 12:18
  • 12107

控制反转(IoC)与依赖注入(DI)——自己的理解

昨天的验收,师姐提到了这个词控制反转与依赖注入  ,在我们的七层抽象工厂的模式中似乎用到了这个知识,于是乎自己动手查查到底是什么东西,发现了意想不到的东西,特此来分享一下。 一、概念(百度) ...
  • tr1912
  • tr1912
  • 2016年05月03日 15:03
  • 1380

什么叫控制反转(IoC )

IOC(Inversion of Control)控制反转模式,意味着去除所有有该类产生但不由该类直接负责的对象实例,而改由外界传入。由简单的对象开发模式到IOC(控制翻转)1. 依赖注入(Depe...
  • cuker919
  • cuker919
  • 2010年12月07日 12:05
  • 5379

透彻理解IoC(控制反转)

 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP、声明式事务等功能在此基础上开花结果。但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,...
  • u014563989
  • u014563989
  • 2017年02月15日 09:26
  • 7120

控制反转(IOC)的简单实现及原理分析

题记 之前转载过一篇关于spring依赖注入的文章(猛点这儿),对于spring的ioc有了直观的感受,但有些问题还是没弄明白。比如spring的IOC容器是如何实现的,为什么要用依赖注入这种方法?...
  • whuslei
  • whuslei
  • 2012年08月11日 14:36
  • 5499

从代理模式到IOC/AOP

业务代理模式,也成为代理者模式。它的核心思想即使用一个通用接口包装一个功能接口,这样,外部访问此功能时,可以在通用接口的代理这里先预处理一部分内容,然后再去执行功能接口。 如果是一个通用接口对一个功...
  • qq_35082030
  • qq_35082030
  • 2016年07月17日 10:23
  • 844

深入理解IOC控制反转及应用实例

一、IOC雏形 1、程序V1.0 话说,多年以前UT公司提出一个需求,要提供一个系统,其中有个功能可以在新春佳节之际给公司员工发送一封邮件。邮件中给大家以新春祝福,并告知发放一定数额的...
  • lqw05
  • lqw05
  • 2016年08月14日 16:29
  • 1715

php设计模式-Ioc(控制反转)和Di(依赖注入)

http://www.thinkphp.cn/topic/12180.html
  • w786572258
  • w786572258
  • 2016年09月24日 15:02
  • 2066
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:控制反转(IoC) ? 工厂模式?
举报原因:
原因补充:

(最多只允许输入30个字)