目录
一 . Factory Method 工厂方法
二. IoC/DI
三.工厂方法模式和IoC/DI有什么关系
四.Spring 的源码分析
一 . Factory Method 工厂方法
定义一个用于创建对象的接口,让子例觉得实例化哪一个类。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
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也就明白了。
(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
分享到:
相关推荐
2. **工厂方法模式**(factoryMethod):相比于简单工厂模式,工厂方法模式将创建对象的具体过程交给了子类,这样每个子类都可以决定自己要创建的对象类型。这种模式提高了代码的可扩展性,因为添加新的产品类型只...
// 静态工厂方法示例 public Object createBeanFromStaticFactory(String beanId, String factoryBeanId, String factoryMethod) { Object factoryBean = getBean(factoryBeanId); Method method = findMethod...
实例化Bean有两种方式:通过`class`属性指定构造器,或者通过`factory-bean`和`factory-method`指定工厂方法。 - **构造器实例化**: ```xml <!-- 构造器参数 --> </bean> ``` - **工厂方法实例化**: ```...
2. 工厂方法创建:我们可以指定一个工厂bean和工厂方法,让Spring通过工厂方法来创建bean。这分为两种情况: - 普通工厂方法:使用非静态方法创建对象。 ```xml <bean id="instanceFactory" class="com.king....
2. **工厂方法配置**:对于非静态工厂类,可以通过`factory-bean`指定工厂对象,`factory-method`指定工厂方法,如`clientService2`。对于静态工厂类,可以直接在`class`属性中指定工厂方法,如`clientService`。 3...
可以使用`class`属性指定Bean的全限定类名,或者使用`factory-bean`和`factory-method`来指定一个工厂方法来创建Bean。 3. **依赖注入(Dependency Injection,DI)**:这是IOC的核心。Spring容器通过setter方法、...
本文将详细介绍在Spring中利用XML配置创建对象的三种主要方法:单例(Singleton)创建、原型(Prototype)创建和工厂方法(Factory Method)创建。 1. 单例(Singleton)创建: Spring默认的bean生命周期管理是...
2. **使用静态工厂方法实例化** ```xml <bean id="exampleBean" class="example.ExampleBean" factory-method="createInstance"/> ``` 在这种方式下,Spring会调用指定类的静态方法`createInstance`来创建Bean...
通过实际操作,你可以更好地理解工厂模式如何在Spring中工作,以及如何利用Spring的IoC(Inversion of Control,控制反转)和DI特性来简化代码和提高可测试性。 总的来说,"day01_eesy_02factory_spring_"的学习...
7. **工厂方法**: 如果需要通过特定的工厂方法来创建bean,可以使用`factory-bean`和`factory-method`属性来指定。 8. **事件发布与监听**: Spring提供了ApplicationEvent和ApplicationListener接口,允许在bean...
<bean id="myService" class="com.example.MyServiceFactory" factory-method="createService"/> ``` 3. **注入依赖**:现在,我们可以在其他需要使用`MyService`的类中,通过@Autowired注解或使用`@Resource`注解...
上面的配置中,首先定义了一个 `InstanceObjectsFactory` 对象,然后通过 `factory-bean` 指定了工厂对象的 ID,通过 `factory-method` 指定了工厂方法的名称。当 Spring.NET 容器需要创建 `instanceCreatedObject` ...
如果需要使用工厂方法,可以指定`factory-method`属性。静态工厂方法示例如下: ```xml <bean id="examplebean" class="example.example" factory-method="createInstance" /> ``` 而对于非静态工厂方法,我们需要...
- **使用静态工厂方法实例化**: 在这种方式下,Spring会调用静态工厂方法来创建Bean实例。这种方法遵循简单工厂模式。例如: ```xml // 下面这段配置的含义:调用Bean2Factory的getBean2方法得到bean2 ...
2. **静态工厂方法实例化**:如果希望使用静态工厂方法创建对象,可以在配置中指定`factory-bean`和`factory-method`属性,Spring会调用指定的静态方法来创建Bean。 3. **实例工厂方法实例化**:与静态工厂方法类似...
这里,`factory-type`指定了包含工厂方法的类,`factory-method`指定了要调用的静态方法。 3. **实例工厂创建**: 对于非静态工厂方法,Spring.Net提供了实例工厂模式。首先,创建一个工厂对象,然后在这个对象上...
3. 实例工厂方法实例化:首先定义一个工厂Bean,然后在其他Bean中使用`factory-bean`属性引用这个工厂Bean,再用`factory-method`指定非静态工厂方法。 【Bean的作用域】 Spring支持五种Bean的作用域: 1. 单例...
- **实例工厂方法**:先创建工厂Bean,然后通过`factory-bean`和`factory-method`属性指定工厂实例的方法创建Bean。 6. **Spring Bean的生命周期**: - 实例化 - 属性注入 - 如果实现了特定接口,如`...
It is a process whereby objects define their dependencies, that is, the other objects they work with, only through constructor arguments, arguments to a factory method, or properties that are set on ...
- **实例工厂方法实例化**:先定义一个工厂Bean,然后通过`factory-bean`属性引用工厂Bean,再用`factory-method`指定工厂方法。 5. **Spring Bean的生命周期**: - **初始化方法**:通过`init-method`属性指定...