《研磨设计模式之 工厂方法模式44036171494.docx》由会员分享,可在线阅读,更多相关《研磨设计模式之 工厂方法模式44036171494.docx(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Evaluation Warning: The document was created with Spire.Doc for .NET.研磨设计模式之 工厂方法模式-1 做做Javaa一晃就十十年了,最最近手痒痒痒,也决定定跟随一下下潮流,整整个博客,写点东西西,就算对对自己的知知识进行一一个梳理和和总结,也也跟朋友们们交流交流流,希望能能坚持下去去。 先写写写设计模模式方面的的内容吧,就就是GoFF的23个个模式,先先从大家最最熟悉的工工厂方法模模式开始,这这个最简单单,明白的的人多,看看看是否能能写出点跟跟别人不一一样的东西西,欢迎大大家来热烈烈讨论,提提出建议或或意见,并并进行批评评指
2、正,一一概虚心接接受,在此此先谢过了了! 另外外,大家也也可以说说说最想看到到哪个模式式,那我就就先写它,呵呵呵,大家家感兴趣,我我才会有动动力写下去去!好了,言言归正传,NNow GGo!工厂方法模模式(Faactorry Meethodd)1 场景景问题1.1 导出数据据的应用框框架 考考虑这样一一个实际应应用:实现现一个导出出数据的应应用框架,来来让客户选选择数据的的导出方式式,并真正正执行数据据导出。 在在一些实际际的企业应应用中,一一个公司的的系统往往往分散在很很多个不同同的地方运运行,比如如各个分公公司或者是是门市点,公公司没有建建立全公司司专网的实实力,但是是又不愿意意让业务数数
3、据实时的的在广域网网上传递,一一个是考虑虑数据安全全的问题,一一个是运行行速度的问问题。 这种种系统通常常会有一个个折中的方方案,那就就是各个分分公司内运运行系统的的时候是独独立的,是是在自己分分公司的局局域网内运运行。然后后在每天业业务结束的的时候,各各个分公司司会导出自自己的业务务数据,然然后把业务务数据打包包通过网络络传送给总总公司,或或是专人把把数据送到到总公司,然然后由总公公司进行数数据导入和和核算。 通通常这种系系统,在导导出数据上上,会有一一些约定的的方式,比比如导出成成:文本格格式、数据据库备份形形式、Exxcel格格式、Xmml格式等等等。 现在在就来考虑虑实现这样样一个应用
4、用框架。在在继续之前前,先来了了解一些关关于框架的的知识。1.2 框架的基基础知识(1):框框架是什么么 简单点说说:框架就就是能完成成一定功能能的半成品品软件。 就其本质质而言,框框架是一个个软件,而而且是一个个半成品的的软件。所所谓半成品品,就是还还不能完全全实现用户户需要的功功能,框架架只是实现现用户需要要的功能的的一部分,还还需要进一一步加工,才才能成为一一个满足用用户需要的的、完整的的软件。因因此框架级级的软件,它它的主要客客户是开发发人员,而而不是最终终用户。 有有些朋友会会想,既然然框架只是是个半成品品,那何必必要去学习习和使用框框架呢?学学习成本也也不算小,那那就是因为为框架能
5、完完成一定的的功能,也也就是这“框框架已经完完成的一定定的功能”在在吸引着开开发人员,让让大家投入入去学习和和使用框架架。(2):框框架能干什什么 能完成成一定功能能,加快应应用开发进进度 由于框框架完成了了一定的功功能,而且且通常是一一些基础的的、有难度度的、通用用的功能,这这就避免我我们在应用用开发的时时候完全从从头开始,而而是在框架架已有的功功能之上继继续开发,也也就是说会会复用框架架的功能,从从而加快应应用的开发发进度。 给我们们一个精良良的程序架架构 框架定定义了应用用的整体结结构,包括括类和对象象的分割,各各部分的主主要责任,类类和对象怎怎么协作,以以及控制流流程等等。现在Java
6、界大多数流行的框架,大都出自大师手笔,设计都很精良。基于这样的框架来开发,一般会遵循框架已经规划好的结构来进行开发,从而让我们开发的应用程序的结构也相对变得精良了。(3):对对框架的理理解 基于框框架来开发发,事情还还是那些事事情,只是是看谁做的的问题 对于于应用程序序和框架的的关系,可可以用一个个图来简单单描述一下下,如图11所示:图1 应用程序序和框架的的简单关系系示意图 如如果没有框框架,那么么客户要求求的所有功功能都由开开发人员自自己来开发发,没问题题,同样可可以实现用用户要求的的功能,只只是开发人人员的工作作多点。 如如果有了框框架,框架架本身完成成了一定的的功能,那那么框架已已有的
7、功能能,开发人人员就可以以不做了,开开发人员只只需要完成成框架没有有的功能,最最后同样是是完成客户户要求的所所有功能,但但是开发人人员的工作作就减少了了。 也就是是说,基于于框架来开开发,软件件要完成的的功能并没没有变化,还还是客户要要求的所有有功能,也也就是“事事情还是那那些事情”的的意思。但但是有了框框架过后,框框架完成了了一部分功功能,然后后开发人员员再完成一一部分功能能,最后由由框架和开开发人员合合起来完成成了整个软软件的功能能,也就是是看这些功功能“由谁谁做”的问问题。 基于框架架开发,可可以不去做做框架所做做的事情,但但是应该明明白框架在在干什么,以以及框架是是如何实现现相应功能能
8、的 事实上上,在实际际开发中,应应用程序和和框架的关关系,通常常都不会如如上面讲述述的那样,分分得那么清清楚,更为为普遍的是是相互交互互的,也就就是应用程程序做一部部分工作,然然后框架做做一部分工工作,然后后应用程序序再做一部部分工作,然然后框架再再做一部分分工作,如如此交错,最最后由应用用程序和框框架组合起起来完成用用户的功能能要求。 也也用个图来来说明,如如图2所示示: 图图2 应应用程序和和框架的关关系示意图图 如如果把这个个由应用程程序和框架架组合在一一起构成的的矩形,当当作最后完完成的软件件。试想一一下,如果果你不懂框框架在干什什么的话,相相当于框架架对你来讲讲是个黑盒盒,也就是是相
9、当于在在上面图22中,去掉掉框架的两两块,会发发现什么?没错,剩剩下的应用用程序是支支离破碎的的,是相互互分隔开来来的。 这会会导致一个个非常致命命的问题,整整个应用是是如何运转转起来的,你你是不清楚楚的,也就就是说对你你而言,项项目已经失失控了,从从项目管理理的角度来来讲,这是是很危险的的。 因此,在在基于框架架开发的时时候,虽然然我们可以以不去做框框架所做的的事情,但但是应该搞搞明白框架架在干什么么,如果条条件许可的的话,还应应该搞清楚楚框架是如如何实现相相应功能的的,至少应应该把大致致的实现思思路和实现现步骤搞清清楚,这样样我们才能能整体的掌掌控整个项项目,才能能尽量减少少出现项目目失控
10、的情情况。(4):框框架和设计计模式的关关系 设计模模式比框架架更抽象 框架架已经是实实现出来的的软件了,虽虽然只是个个半成品的的软件,但但毕竟是已已经实现出出来的了。而而设计模式式的重心还还在于解决决问题的方方案上,也也就是还停停留在思想想的层面。因因此设计模模式比框架架更为抽象象。 设计计模式是比比框架更小小的体系结结构元素 如上上所述,框框架是已经经实现出来来的软件,并并实现了一一系列的功功能,因此此一个框架架,通常会会包含多个个设计模式式的应用。 框框架比设计计模式更加加特例化 框架架是完成一一定功能的的半成品软软件,也就就是说,框框架的目的的很明确,就就是要解决决某一个领领域的某些些
11、问题,那那是很具体体的功能,不不同的领域域实现出来来的框架是是不一样的的。 而而设计模式式还停留在在思想的层层面,在不不同的领域域都可以应应用,只要要相应的问问题适合用用某个设计计模式来解解决。因此此框架总是是针对特定定领域的,而而设计模式式更加注重重从思想上上,从方法法上来解决决问题,更更加通用化化。1.3 有何问题题 分分析上面要要实现的应应用框架,不不管用户选选择什么样样的导出格格式,最后后导出的都都是一个文文件,而且且系统并不不知道究竟竟要导出成成为什么样样的文件,因因此应该有有一个统一一的接口,来来描述系统统最后生成成的对象,并并操作输出出的文件。 先把导出的文件对象的接口定义出来,
12、示例代码如下:/* 导出出的文件对对象的接口口*/publiic innterfface ExpoortFiileAppi /* * 导出出内容成为为文件 * pparamm datta 示意意:需要保保存的数据据 * rreturrn 是否否导出成功功 */ ppubliic boooleaan exxportt(Strring dataa); 对对于实现导导出数据的的业务功能能对象,它它应该根据据需要来创创建相应的的ExpoortFiileAppi的实现现对象,因因为特定的的ExpoortFiileAppi的实现现是与具体体的业务相相关的。但但是对于实实现导出数数据的业务务功能对象象而言,
13、它它并不知道道应该创建建哪一个EExporrtFilleApii的实现对对象,也不不知道如何何创建。 也也就是说:对于实现现导出数据据的业务功功能对象,它它需要创建建ExpoortFiileAppi的具体体实例对象象,但是它它只知道EExporrtFilleApii接口,而而不知道其其具体的实实现。那该该怎么办呢呢?研磨设计模模式之 工工厂方法模模式-22 解解决方案2.1 工厂方法法模式来解解决 用用来解决上上述问题的的一个合理理的解决方方案就是工工厂方法模模式。那么么什么是工工厂方法模模式呢?(11)工厂方方法模式定定义 定义一一个用于创创建对象的的接口,让让子类决定定实例化哪哪一个类,F
14、Factoory MMethood使一个个类的实例例化延迟到到其子类。(2)应用用工厂方法法模式来解解决的思路路 仔细分析析上面的问问题,事实实上在实现现导出数据据的业务功功能对象里里面,根本本就不知道道究竟要使使用哪一种种导出文件件的格式,因因此这个对对象本就不不应该和具具体的导出出文件的对对象耦合在在一起,它它只需要面面向导出的的文件对象象的接口就就好了。 但但是这样一一来,又有有新的问题题产生了:接口是不不能直接使使用的,需需要使用具具体的接口口实现对象象的实例。 这不是自相矛盾吗?要求面向接口,不让和具体的实现耦合,但是又需要创建接口的具体实现对象的实例。怎么解决这个矛盾呢? 工厂方法
15、模式的解决思路很有意思,那就是不解决,采取无为而治的方式:不是需要接口对象吗,那就定义一个方法来创建;可是事实上它自己是不知道如何创建这个接口对象的,没有关系,那就定义成抽象方法就好了,自己实现不了,那就让子类来实现,这样这个对象本身就可以只是面向接口编程,而无需关心到底如何创建接口对象了。2.2 模式结构构和说明 工工厂方法模模式的结构构如图3所所示: 图图3 工工厂方法模模式结构示示意图Produuct: 定义工厂厂方法所创创建的对象象的接口,也也就是实际际需要使用用的对象的的接口。CConcrretePProduuct: 具具体的Prroducct接口的的实现对象象。Creeatorr:
16、 创建器器,声明工工厂方法,工工厂方法通通常会返回回一个Prroducct类型的的实例对象象,而且多多是抽象方方法。也可可以在Crreatoor里面提提供工厂方方法的默认认实现,让让工厂方法法返回一个个缺省的PProduuct类型型的实例对对象。CooncreeteCrreatoor: 具体体的创建器器对象,覆覆盖实现CCreattor定义义的工厂方方法,返回回具体的PProduuct实例例。2.3 工厂方法法模式示例例代码(1)先看看看Prooductt的定义,示示例代码如如下:/* 工厂厂方法所创创建的对象象的接口*/publiic innterfface Prodduct /可以定定义P
17、rooductt的属性和和方法(2)再看看看具体的的Prodduct的的实现对象象,示例代代码如下:/* 具体体的Prooductt对象*/publiic cllass ConccreteeProdduct impllemennts PProduuct /实现PProduuct要求求的方法(3)接下下来看看创创建器的定定义,示例例代码如下下:/* 创建建器,声明明工厂方法法*/publiic abbstraact cclasss Creeatorr /* * 创建建Prodduct的的工厂方法法 * rreturrn Prroducct对象 */ pproteectedd absstracct
18、 Prroducct faactorryMetthod(); /* * 示意意方法,实实现某些功功能的方法法 */ ppubliic vooid ssomeOOperaationn() /通常在这这些方法实实现中,需需要调用工工厂方法来来获取Prroducct对象 Prroducct prroducct = facttoryMMethood(); (4)再看看看具体的的创建器实实现对象,示示例代码如如下:/* 具体体的创建器器实现对象象*/publiic cllass ConccreteeCreaator exteends Creaator pproteectedd Prooductt fac
19、ctoryyMethhod() /重定义工工厂方法,返返回一个具具体的Prroducct对象 reeturnn neww ConncretteProoductt(); 2.4 使用工厂厂方法模式式来实现示示例 要要使用工厂厂方法模式式来实现示示例,先来来按照工厂厂方法模式式的结构,对对应出哪些些是被创建建的Prooductt,哪些是是Creaator。分分析要求实实现的功能能,导出的的文件对象象接口ExxporttFileeApi就就相当于是是Prodduct,而而用来实现现导出数据据的业务功功能对象就就相当于CCreattor。把把Prodduct和和Creaator分分开过后,就就可以分别
20、别来实现它它们了。 使使用工厂模模式来实现现示例的程程序结构如如图4所示示: 图44 使用用工厂模式式来实现示示例的程序序结构示意意图下面面一起来看看看代码实实现。(11)导出的的文件对象象接口ExxporttFileeApi的的实现没有有变化,这这里就不去去赘述了(22)接下来来看看接口口ExpoortFiileAppi的实现现,为了示示例简单,只只实现导出出文本文件件格式和数数据库备份份文件两种种。先看看看导出文本本文件格式式的实现,示示例代码如如下:/* 导出出成文本文文件格式的的对象*/publiic cllass ExpoortTxxtFille immplemmentss Expp
21、ortFFileAApi ppubliic boooleaan exxportt(Strring dataa) /简单示意意一下,这这里需要操操作文件 Syystemm.outt.priintlnn(导出出数据+dataa+到文文本文件); reeturnn truue; 再看看导出出成数据库库备份文件件形式的对对象的实现现,示例代代码如下:/* 导出出成数据库库备份文件件形式的对对象*/publiic cllass ExpoortDBB impplemeents ExpoortFiileAppi ppubliic boooleaan exxportt(Strring dataa) /简单示意
22、意一下,这这里需要操操作数据库库和文件 Syystemm.outt.priintlnn(导出出数据+dataa+到数数据库备份份文件); reeturnn truue; (3)Crreatoor这边的的实现,首首先看看EExporrtOpeeratee的实现,示示例代码如如下:/* 实现现导出数据据的业务功功能对象*/publiic abbstraact cclasss ExpportOOperaate /* * 导出出文件 * pparamm datta 需要要保存的数数据 * rreturrn 是否否成功导出出文件 */ ppubliic boooleaan exxportt(Strrin
23、g dataa) /使用工厂厂方法 ExxporttFileeApi api = faactorryMetthod(); reeturnn apii.expport(dataa); /* * 工厂厂方法,创创建导出的的文件对象象的接口对对象 * rreturrn 导出出的文件对对象的接口口对象 */ pproteectedd absstracct ExxporttFileeApi facttoryMMethood();(4)加入入了两个CCreattor实现现,先看看看创建导出出成文本文文件格式的的对象,示示例代码如如下:/* 具体体的创建器器实现对象象,实现创创建导出成成文本文件件格式的对对
24、象*/publiic cllass ExpoortTxxtFilleOpeeratee exttendss ExpportOOperaate pproteectedd ExpportFFileAApi ffactooryMeethodd() /创建导出出成文本文文件格式的的对象 reeturnn neww ExpportTTxtFiile(); 再看看创建建导出成数数据库备份份文件形式式的对象,示示例代码如如下:/* 具体体的创建器器实现对象象,实现创创建导出成成数据库备备份文件形形式的对象象*/publiic cllass ExpoortDBBOperrate exteends Expoor
25、tOpperatte pproteectedd ExpportFFileAApi ffactooryMeethodd() /创建导出出成数据库库备份文件件形式的对对象 reeturnn neww ExpportDDB(); (5)客户户端直接创创建需要使使用的Crreatoor对象,然然后调用相相应的功能能方法,示示例代码如如下:publiic cllass Clieent ppubliic sttaticc voiid maain(SStrinng argss) /创建需要要使用的CCreattor对象象 ExxporttOperrate operrate = neew ExxporttDB
26、Opperatte(); /调用输出出数据的功功能方法 opperatte.exxportt(测试试数据); 运行结果如如下:导出数据测测试数据到到数据库备备份文件 你还可以以修改客户户端neww的对象,切切换成其它它的实现对对象,试试试看会发生生什么。看看来应用工工厂方法模模式是很简简单的,对对吧。研磨设计模模式之 工工厂方法模模式-33 模式式讲解3.1 认识工厂厂方法模式式(1)模式式的功能 工工厂方法的的主要功能能是让父类类在不知道道具体实现现的情况下下,完成自自身的功能能调用,而而具体的实实现延迟到到子类来实实现。 这样样在设计的的时候,不不用去考虑虑具体的实实现,需要要某个对象象,
27、把它通通过工厂方方法返回就就好了,在在使用这些些对象实现现功能的时时候还是通通过接口来来操作,这这非常类似似于IoCC/DI的的思想,这这个在后面面给大家稍稍详细点介介绍一下。(2)实现现成抽象类类 工厂方法法的实现中中,通常父父类会是一一个抽象类类,里面包包含创建所所需对象的的抽象方法法,这些抽抽象方法就就是工厂方方法。 这里里要注意一一个问题,子子类在实现现这些抽象象方法的时时候,通常常并不是真真的由子类类来实现具具体的功能能,而是在在子类的方方法里面做做选择,选选择具体的的产品实现现对象。 父父类里面,通通常会有使使用这些产产品对象来来实现一定定的功能的的方法,而而且这些方方法所实现现的
28、功能通通常都是公公共的功能能,不管子子类选择了了何种具体体的产品实实现,这些些方法的功功能总是能能正确执行行。(3)实现现成具体的的类 当然也也可以把父父类实现成成为一个具具体的类,这这种情况下下,通常是是在父类中中提供获取取所需对象象的默认实实现方法,这这样就算没没有具体的的子类,也也能够运行行。 通常这这种情况还还是需要具具体的子类类来决定具具体要如何何创建父类类所需要的的对象。也也把这种情情况称为工工厂方法为为子类提供供了挂钩,通通过工厂方方法,可以以让子类对对象来覆盖盖父类的实实现,从而而提供更好好的灵活性性。(4)工厂厂方法的参参数和返回回 工厂方法法的实现中中,可能需需要参数,以以
29、便决定到到底选用哪哪一种具体体的实现。也也就是说通通过在抽象象方法里面面传递参数数,在子类类实现的时时候根据参参数进行选选择,看看看究竟应该该创建哪一一个具体的的实现对象象。 一般工工厂方法返返回的是被被创建对象象的接口对对象,当然然也可以是是抽象类或或者一个具具体的类的的实例。(5)谁来来使用工厂厂方法创建建的对象 这这里首先要要搞明白一一件事情,就就是谁在使使用工厂方方法创建的的对象? 事事实上,在在工厂方法法模式里面面,应该是是Creaator中中的其它方方法在使用用工厂方法法创建的对对象,虽然然也可以把把工厂方法法创建的对对象直接提提供给Crreatoor外部使使用,但工工厂方法模模式
30、的本意意,是由CCreattor对象象内部的方方法来使用用工厂方法法创建的对对象,也就就是说,工工厂方法一一般不提供供给Creeatorr外部使用用。 客户端端应该是使使用Creeatorr对象,或或者是使用用由Creeatorr创建出来来的对象。对对于客户端端使用Crreatoor对象,这这个时候工工厂方法创创建的对象象,是Crreatoor中的某某些方法使使用。对于于使用那些些由Creeatorr创建出来来的对象,这这个时候工工厂方法创创建的对象象,是构成成客户端需需要的对象象的一部分分。分别举举例来说明明。 客户端使使用Creeatorr对象的情情况 比如前前面的示例例,对于“实实现导出
31、数数据的业务务功能对象象”的类EExporrtOpeeratee,它有一一个expport的的方法,在在这个方法法里面,需需要使用具具体的“导导出的文件件对象的接接口对象” ExpoortFiileAppi,而EExporrtOpeeratee是不知道道具体的EExporrtFilleApii实现的,那那么怎么做做的呢?就就是定义了了一个工厂厂方法,用用来返回EExporrtFilleApii的对象,然然后expport方方法会使用用这个工厂厂方法来获获取它所需需要的对象象,然后执执行功能。 这个时候的客户端是怎么做的呢?这个时候客户端主要就是使用这个ExportOperate的实例来完成它想
32、要完成的功能,也就是客户端使用Creator对象的情况,简单描述这种情况下的代码结构如下:/* 客户户端使用CCreattor对象象的情况下下,Creeatorr的基本实实现结构*/publiic abbstraact cclasss Creeatorr /* * 工厂厂方法,一一般不对外外 * rreturrn 创建建的产品对对象 */ pproteectedd absstracct Prroducct faactorryMetthod(); /* * 提供供给外部使使用的方法法, * 客户户端一般使使用Creeatorr提供的这这些方法来来完成所需需要的功能能 */ ppubliic vo
33、oid ssomeOOperaationn() /在这里使使用工厂方方法 Prroducct p = faactorryMetthod(); 客户端使使用由Crreatoor创建出出来的对象象 另外一种种是由Crreatoor向客户户端返回由由“工厂方方法创建的的对象”来来构建的对对象,这个个时候工厂厂方法创建建的对象,是是构成客户户端需要的的对象的一一部分。简简单描述这这种情况下下的代码结结构如下:/* 客户户端使用CCreattor来创创建客户端端需要的对对象的情况况下,Crreatoor的基本本实现结构构*/publiic abbstraact cclasss Creeatorr /*
34、* 工厂厂方法,一一般不对外外,创建一一个部件对对象 * rreturrn 创建建的产品对对象,一般般是另一个个产品对象象的部件 */ pproteectedd absstracct Prroducct1 ffactooryMeethodd1(); /* * 工厂厂方法,一一般不对外外,创建一一个部件对对象 * rreturrn 创建建的产品对对象,一般般是另一个个产品对象象的部件 */ pproteectedd absstracct Prroducct2 ffactooryMeethodd2(); /* * 创建建客户端需需要的对象象,客户端端主要使用用产品对象象来完成所所需要的功功能 *
35、rreturrn 客户户端需要的的对象 */ ppubliic Prroducct crreateeProdduct() /在这里使使用工厂方方法,得到到客户端所所需对象的的部件对象象 Prroducct1 pp1 = facttoryMMethood1(); Prroducct2 pp2 = facttoryMMethood2(); /工厂方法法创建的对对象是创建建客户端对对象所需要要的 Prroducct p = neew CooncreetePrroducct(); p.setPProduuct1(p1); p.setPProduuct2(p2); reeturnn p; 小小结一下:在
36、工厂方方法模式里里面,客户户端要么使使用Creeatorr对象,要要么使用CCreattor创建建的对象,一一般客户端端不直接使使用工厂方方法。当然然也可以直直接把工厂厂方法暴露露给客户端端操作,但但是一般不不这么做。(6)工厂厂方法模式式的调用顺顺序示意图图 由于客户户端使用CCreattor对象象有两种典典型的情况况,因此调调用的顺序序示意图也也分做两种种情况,先先看看客户户端使用由由Creaator创创建出来的的对象情况况的调用顺顺序示意图图,如图55所示: 图5 客户端使使用由Crreatoor创建出出来的对象象的调用顺顺序示意图图接下来看看看客户端使使用Creeatorr对象时候候的
37、调用顺顺序示意图图,如图66所示: 图6 客户端端使用Crreatoor对象的的调用顺序序示意图研磨设计模模式之 工工厂方法模模式-43.2 工厂方法法模式与IIoC/DDIIoCInvversiion oof Coontrool 控控制反转DIDepeendenncy IInjecctionn 依依赖注入1:如何理理解IoCC/DI 要要想理解上上面两个概概念,就必必须搞清楚楚如下的问问题: 参与者都有有谁? 依赖:谁依依赖于谁?为什么需需要依赖? 注入:谁注注入于谁?到底注入入什么? 控制反转:谁控制谁谁?控制什什么?为何何叫反转(有有反转就应应该有正转转了)? 依赖注入和和控制反转转是同
38、一概概念吗? 下下面就来简简要的回答答一下上述述问题,把把这些问题题搞明白了了,IoCC/DI也也就明白了了。(1)参参与者都有有谁: 一一般有三方方参与者,一一个是某个个对象;一一个是IooC/DII的容器;另一个是是某个对象象的外部资资源。 又要要名词解释释一下,某某个对象指指的就是任任意的、普普通的Jaava对象象; IooC/DII的容器简简单点说就就是指用来来实现IooC/DII功能的一一个框架程程序;对象象的外部资资源指的就就是对象需需要的,但但是是从对对象外部获获取的,都都统称资源源,比如:对象需要要的其它对对象、或者者是对象需需要的文件件资源等等等。(2)谁谁依赖于谁谁:当当然
39、是某个个对象依赖赖于IoCC/DI的的容器(33)为什么么需要依赖赖:对对象需要IIoC/DDI的容器器来提供对对象需要的的外部资源源(4)谁谁注入于谁谁:很很明显是IIoC/DDI的容器器 注入 某个对象象(5)到到底注入什什么:就就是注入某某个对象所所需要的外外部资源(66)谁控制制谁:当当然是IooC/DII的容器来来控制对象象了(7)控控制什么:主主要是控制制对象实例例的创建(88)为何叫叫反转: 反反转是相对对于正向而而言的,那那么什么算算是正向的的呢?考虑虑一下常规规情况下的的应用程序序,如果要要在A里面面使用C,你你会怎么做做呢?当然然是直接去去创建C的的对象,也也就是说,是是在
40、A类中中主动去获获取所需要要的外部资资源C,这这种情况被被称为正向向的。那么么什么是反反向呢?就就是A类不不再主动去去获取C,而而是被动等等待,等待待IoC/DI的容容器获取一一个C的实实例,然后后反向的注注入到A类类中。 用图图例来说明明一下,先先看没有IIoC/DDI的时候候,常规的的A类使用用C类的示示意图,如如图7所示示: 图7 常规AA使用C示示意图当有了IooC/DII的容器后后,A类不不再主动去去创建C了了,如图88所示: 图8 A类不再再主动创建建C而是被动等等待,等待待IoC/DI的容容器获取一一个C的实实例,然后后反向的注注入到A类类中,如图图9所示:图图9 有有IoC/D
41、I容器器后程序结结构示意图图(9)依赖赖注入和控控制反转是是同一概念念吗? 根据据上面的讲讲述,应该该能看出来来,依赖注注入和控制制反转是对对同一件事事情的不同同描述,从从某个方面面讲,就是是它们描述述的角度不不同。依赖赖注入是从从应用程序序的角度在在描述,可可以把依赖赖注入描述述完整点:应用程序序依赖容器器创建并注注入它所需需要的外部部资源;而而控制反转转是从容器器的角度在在描述,描描述完整点点:容器控控制应用程程序,由容容器反向的的向应用程程序注入应应用程序所所需要的外外部资源。(10)小结一下: 其其实IoCC/DI对对编程带来来的最大改改变不是从从代码上,而而是从思想想上,发生生了“主从从换位”的的变化。应应用程序原原本是老大大,要获取取什么资源源都是主动动出击,但但是在IooC/DII思想中,应应用程序就就变成被动动的了,被被动的等待待IoC/DI容器器来创建并并注入它所所需要的资资源了。 这这么小小的的一个改变变其实是