首页 > 技术文章 > 工厂方法模式

ghpaas 2014-08-06 13:25 原文

1、工厂方法模式中的角色:

工厂方法模式的客户端对抽象工厂类、抽象产品进行编程,也就是应该针对抽象编程,而不应该是针对具体工厂类及具体产品编程。

clip_image001

从上图可以看出,这个使用了工厂方法模式的系统涉及到以下的角色:

(1)、抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在上面的系统

中这个角色由Java 接口Creator 扮演;在实际的系统中,这个角色也常常使用抽

象Java 类实现。

(2)、具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体Java 类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用

以创建产品对象。在本系统中给出了两个这样的角色,也就是具体Java 类

ConcreteCreator1 和ConcreteCreator2。

(3)、抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在本系统中,这个角色由Java 接口Product 扮

演;在实际的系统中,这个角色也常常使用抽象Java 类实现。

(4)、具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

2、工厂模式简单示意图:

clip_image002

然后由相应的工厂角色创建相应的产品角色,工厂方法模式的应用如下图所示,图中的虚线代表创建(依赖)关系。

工厂方法模式并没有限制产品等级结构的层数。一般的书籍中都以两个层次为例,第

一层是抽象产品层,第二层是具体产品层。但是在实际的系统中,产品常常有更为复杂的

层次。

clip_image003

3、工厂方法模式时序图:

clip_image004

4、工厂方法模式在JAVA JDK中应用:

应用场景1:所有的Java 聚集都实现java.util.Collection 接口,这个接口规定所有的Java 聚集必须提供一个iterator()方法,返还一个Iterator 类型的对象,如下图所示。

clip_image005

一 个具体的Java 聚集对象会通过这个iterator()方法接口返还一个具体的Iterator 类。可以看出,这个iterator()方法就是一个工厂方法。

应用场景2:类似地,Java 的列是一种特殊的Java 聚集。所有的Java 除了实现了Collection 接口之外,还实现了一个List 接口。这个List 接口给出了两个工厂方法,一个是上面已经讨论过的iterator()方法,返还一个Iterator 类型的对象;另一个是listIterator()方法,返还一个ListIterator 类型的对象。

有趣的是,Iterator 和ListIterator 组成一个继承的等级结构,后者是前者的子接口。如下图所示。

clip_image006

应用场景3:URL 与URLConnection 中的应用,其实这个更像是简单工厂模式。

clip_image007

推荐阅读