认真思考创建对象的几种方式

来源:互联网 发布:阿里云学生认证 高中生 编辑:程序博客网 时间:2024/05/16 04:41

工厂方法模式(Factory Method Pattern)

 定义:定义一个创建对象的接口,但由子类决定要实例化的类是那一个。工厂方法让类把实例化推迟到子类。 在工厂方法模式中,核心的工厂类将不再负责产品的创建,而是将创建的工作交给子类去完成。它仅仅负责给出接口,不负责具体实现。因此可以轻易的引入新产品。


控制反转(Inversion of Control)

在没有引入控制反转这个概念之前,当A对象需要B对象的时候,A对象必须主动去实例化B对象或者获取B对象的引用,控制权在A对象自己的手上。在使用了IOC之后,当A对象需要B对象的时候,IOC容器会主动注入一个B对象给A使用,A是被动接受B对象。在A获取B的过程中,获取B对象的方式被反转了。由主动获取变为被动接受,这就是控制反转。

依赖注入(Dependency Injection)

经过查询资料得知,依赖注入这个概念是Martin Fowler提出的。他提出IOC控制反转指的是获取对象的过程被反转了,获取对象的过程由自身主动管理变为IOC容器主动注入。于是他提出依赖注入这个概念。所谓依赖注入,就是IOC容器在运行期间动态的将某种依赖关系注入到对象之中。所以,依赖注入和控制反转是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现具有依赖关系的对象之间的解耦。

服务定位器(Service Locator Pattern)

 一开始我并不知道这个模式,我是在构思如何包裹我的IOC容器的时候发现这个模式的。当时我想的是如果我想换一个IOC容器,只需要改一个配制就可以完成IOC容器的切换,摸索中知道了这个模式。这个模式想要解决的问题就是解耦合服务提供者给用户,用户无需直接访问具体的服务提供者类。

区别(what's the difference?)

    程序的侵入性1.调用第三方的API  2.方法参数接受第三方API   3.实现了第三方接口 4.继承了第三方基类
  1.  从目的角度来看:工厂模式的目的是将实例化推迟到子类,而IOC是为了实现具有依赖关系的对象之间的解耦。因此当我们遇到 new Service(new Repository(new UnitOfWork()) )这种情况的时候,肯定选择IOC,因为无论是什么工厂都是不容易解决这个多层依赖关系的。
  2. 从对象生命周期角度来看:工厂是无法管理创建对象的生命周期的。对于工作单元来说,每个请求必须在同一个工作单元内,不然是无法保证事务的一致性的。
  3.  从单元测试的角度看:IOC可以使依赖对象相互独立,可维护性好。每一个对象都可以单独进行单元测试,只要保证自身无误就好。
  4. 从程序的侵入性角度来看:明显服务定位器违反了第一条,并且使得程序和ServiceLocator增加了耦合,而IOC并没有违反。
0 0
原创粉丝点击