`

Factory Method 工厂方法和IoC/DI

阅读更多

 

目录
 . Factory Method 工厂方法
. IoC/DI
.工厂方法模式和IoC/DI有什么关系
.Spring 的源码分析

 

 

. Factory Method 工厂方法

definition

定义一个用于创建对象的接口,让子例觉得实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

          Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

 

Frequency of use:   high

 

UML class diagram

 

 

participants

    The classes and/or objects participating in this pattern are:

 

Product  (Page)

defines the interface of objects the factory method creates

ConcreteProduct  (SkillsPage, EducationPage, ExperiencePage)

implements the Product interface

Creator  (Document)

declares the factory method, which returns an object of type Product. Creator may also define a default implementation of the factory method that returns a default ConcreteProduct object.

may call the factory method to create a Product object.

ConcreteCreator  (Report, Resume)

overrides the factory method to return an instance of a ConcreteProduct.

. IoC/DI

要想理解上面两个概念,就必须搞清楚如下的问题:

参与者都有谁?

依赖:谁依赖于谁?为什么需要依赖?

注入:谁注入于谁?到底注入什么?

控制反转:谁控制谁?控制什么?为何叫反转(有反转就应该有正转了)?

依赖注入和控制反转是同一概念吗?

    下面就来简要的回答一下上述问题,把这些问题搞明白了,IoC/DI也就明白了。

1)参与者都有谁:

一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。

又要名词解释一下,某个对象指的就是任意的、普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。

2)谁依赖于谁:

当然是某个对象依赖于IoC/DI的容器

3)为什么需要依赖:

对象需要IoC/DI的容器来提供对象需要的外部资源

4)谁注入于谁:

很明显是IoC/DI的容器 注入 某个对象

5)到底注入什么:

就是注入某个对象所需要的外部资源

6)谁控制谁:

当然是IoC/DI的容器来控制对象了

7)控制什么:

主要是控制对象实例的创建

8)为何叫反转:

反转是相对于正向而言的,那么什么算是正向的呢?考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。

 

9)依赖注入和控制反转是同一概念吗?

根据上面的讲述,应该能看出来,依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

10)小结一下:

其实IoC/DI对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入它所需要的资源了。

这么小小的一个改变其实是编程思想的一个大进步,这样就有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

 

.工厂方法模式和IoC/DI有什么关系

从某个角度讲,它们的思想很类似。

上面讲了,有了IoC/DI过后,应用程序就不再主动了,而是被动等待由容器来注入资源,那么在编写代码的时候,一旦要用到外部资源,就会开一个窗口,让容器能注入进来,也就是提供给容器使用的注入的途径,当然这不是我们的重点,就不去细细讲了,用setter注入来示例一下,看看使用IoC/DI的代码是什么样子

.Spring 的源码分析

待续…..

 

 

个人笔记,较多源于网络

http://www.dofactory.com/Patterns/PatternFactory.aspx

http://www.iteye.com/topic/692793

 

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics