Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96768
  • 博文数量: 73
  • 博客积分: 3971
  • 博客等级: 中校
  • 技术积分: 875
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-09 20:57
文章分类

全部博文(73)

文章存档

2008年(73)

我的朋友
最近访客

分类: Java

2008-05-15 14:34:42

创建模式(Creational Pattern)

——对类的实例化过程的抽象,在创建对象时,动态地决定怎样创建对象,创建哪些对象

类的创建模式:使用继承关系,把类的创建延迟到子类

对象的创建模式:把对象的创建过程动态地委派给另一个对象

1、简单工厂模式(Simple Factory)/ 静态工厂方法模式(Static Factory Method)

由一个工厂对象决定创建出哪一种产品类的实例

工厂类角色(Creator):可以有多个工厂方法,分别负责创建不同的产品对象,比如J2SE中的DateFormat。

抽象产品角色(Product):主要目的是给所有的具体产品类提供一个共同的类型,在最简单的情况下,可以简化一个标识接口,如J2SE中的Serializable接口,即没有声明任何方法的空接口。

具体产品角色(Concrete Product)

工厂角色和可以与抽象产品角色合并(如J2SE中的DateFormat)

工厂角色、抽象产品、具体产品合并

产品对象的循环使用和登记式的工厂方法

简单工厂模式的优点

核心是工厂类,含有必要的判断逻辑,决定在什么时候创建哪一个产品的实例,需要产品的只需要负责消费产品即可,实现了对责任的分割。

简单工厂模式的缺点

当产品有复杂的多层次等级结构时,工厂类创建产品的逻辑就非常复杂,同时当增加了一个新产品时,工厂类的创建产品的方法就需要改变。同时因为使用的是静态方法做为工厂方法,无法继承,工厂角色无法形成基于继承的等级结构,这些缺点都在工厂方法模式中得到克服。

2、工厂方法模式(Factory Method)

是简单工厂模式的进一步抽象和推广,核心的工厂类不再负责所有的产品创建,变成一个抽象工厂角色,将具体创建的工作交给子类做,只负责给出具体工厂子类必须实现的接口。

在这个系统设计中,常首先有产品角色,然后有工厂角色。

在可以应用工厂方法模式的情形下,一般都会有一个产品的等级结构,有一个或多个抽象产品和多个具体产品组成。工厂方法模式常按产品的等级结构设计一个同结构的工厂等级结构,由相应的工厂角色创建相应的产品角色。

抽象工厂角色

具体工厂角色

抽象产品角色

具体产品角色

当要加入一个新产品时,只要向系统中加入一个这样的产品类以及它所对应的工厂类即可。

在JAVA中的应用:

Collection接口,iterator()方法,返回一个Iterator类型的对象
一个具体的JAVA聚集对象会通过iterator()方法,返回一个具体的Iterator类对象
这个iterator()方法就是一个工厂方法

List接口,两个工厂方法:iterator()和ListIiterator(),一个返回Iterator类型的对象,一个返回ListIterator类型的对象。Iterator和ListIterator组成一个继承的等级结构,后者是前者的子接口。

URL与URLConnection
URL对象提借供一个openConnection()的工厂方法,这个方法返回一个URLConnection对象
1、创建一个以http://rella.blogchina.com为目标的URL对象。
2、调用URL对象的openConnection()方法,得到一个http://rella.blogchina.com的远程连接对象,这个对象的类型是URLConnection。
3、调用URLConnection对象的getInputStream()方法读入远程URL的数据。

工厂方法返回的应该都是抽象类型,无法事先得知返回的是哪一种具体类型对象。象toString()、clone()方法虽然返回了一个对象,但并不是工厂方法,因为它们都在事先知道将要得到的是什么具体的数据类型。

3、抽象工厂模式(Abstract Factory)

抽象工厂模式向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象,也就是说在产品的等级结构中,位于顶层的抽象产品角色是多个。
抽象来自抽象产品角色,抽象工厂就是抽象产品角色的工厂。
抽象工厂模式面对的问题是多个产品等级结构的系统设计。工厂方法模式面对的问题是一个产品等级结构。

产品族(Product Family):指位于不同产品等级结构中,功能相关联的产品组成的家族。产品族和产品等级结构将产品接照不同方向划分,形成一个二维的坐标系。

当多个不同的等级结构具有平行的结构时,如果采用工厂方法模式,就势必要使用多个独立的工厂等级结构来对应不同的产品等级结构,由于这些产品等级结构的相似性,会导致产生多个平行的工厂等级结构,随着产品等级结构的数目增加,工厂方法模式所给出的工厂等级结构数目也会随之增加。

所以使用同一个工厂等级结构来对付这些相同或相似的产品等级结构是不是可行的呢?
这就是抽象工厂模式的好处。同一个工厂等级结构负责不同产品等级结构中的产品对象的创建。
一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。
每一个产品族都有一个具体的工厂,每一个具体的工厂负责创建属于同一个产品族,但分属于不同等级结构的产品。

当增加一个产品族时,只需要增加一个具体的工厂类即可。
当增加一个产品等级结构时,则需要修改每一个具体的工厂类,给每一个工厂类都增加一个新的工厂方法。

阅读(394) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~