简单工厂模式

1.问题描述

 

   一般我们在针对接口编程的时候会这样子来实现:假如接口名为Api,其实现类为ImplApi。我们在使用的时候会这样子来实例化:Api api = new ImplApi();但是这样会存在一个问题:就是调用者<客户端>知道了ImplApi这个类便是Api接口的一个实现类。那么问题来了,我只想让调用者知道有这样的一个接口,但有关的实现类等信息不想让调用者知道,我该怎么办.

2.解决方案

 

  简单工厂模式:提供一个创建对象实例的工厂-Factory.目的就是不让调用者知道接口的实现等信息,把对象实例化这个过程向调用者隐藏,对象实例化后返回给调用者,让调用者来操作使用接口中的方法。

3.实例图解

 

  由上分析可知:我们需要提供一个工厂类来进行接口的实例化,如下图.而对于这个工厂类的实现,我们可进行以下考量来优化我们的工厂类:

  •   工厂类的实现可以采用"静态类+静态方法"来实现,如果想防止调用者对工厂实例化也可以将工厂构造方法私有化。

  •   简单工厂理论上可以创建任何实例对象,但最好将这些创建的对象限定在一个组件或者模块范围内,这样会是工厂职责分明。建议通过"模块名+Factory"来命名工厂类。

4.可配置的工厂

 

   一般简单工厂的实现是通过调用者传入一些条件参数来获得相应的接口实例,但这样会过多的暴露一些内部细节给调用者,可通过"反射+配置文件"来实现可配置

5.优缺点

 

  优点:

  • 友好的帮助实现组件的封装,让组件外部真正实现接口编程。          
  • 实现调用者<客户端>与实现类的解耦。

  缺点:

  • 像如果我们的工厂通过传入的参数条件类实例化对象,这样会增加客户端使用上的复杂度。
  • 不便于扩展工厂:构造方法私有+静态方法,使子类不能改变方法的行为不便于扩展。
posted @ 2015-09-27 22:32  这是个坑  阅读(156)  评论(0)    收藏  举报