ID #81579

实现Java抽象工厂模式


  了解模式需要研究客户端程序(使用模式者)和模式的内部结构,并且理解两者之间的通信接口、模式本身因功能增加造成的变动(易碎性),以及客户端程序利用新功能的难易程度。本文针对这些问题提出了一个具体的抽象工厂模式实现方案。
  模式结构介绍
  这个模式由一个工厂类层次和N个产品类层次组成。从每一个产品类层次中取出一个产品类形成产品类族,这个类族的实例为产品族。产品族中的产品之间有一种依靠关系。一个具体的工厂类负责创建产品族中的各个产品。
  从图1可以看出,通信接口由一个抽象工厂接口和两个抽象产品组成。模式部分显示了两个产品类 PRodUCtA 和ProductB、两个产品类族ProductA1、ProductB1和ProductA2、ProductB2,以及两个产品类族对应的两个工厂ConcreteFactory1、ConcreteFactory2。
   实现Java抽象工厂模式(图一)
  图1 标准抽象工厂模式
  从模式定义中知道这个模式的意图内容为:
  提供一个创建一系列相关或相互依靠对象的接口,而无需指定它们具体的类。工厂类层次的通信接口只有抽象工厂和创建产品族的各个工厂方法,这些工厂方法不带任何参数,并且返回具有抽象产品类型的具体产品实例。这些使得客户端可以不依靠具体产品的类,从而体现了模式的意图。意图中的“而无需指定它们具体的类”可以理解为客户端在使用和创建具体产品时不给出具体产品的任何暗示。
  变动
  我们分析模式的变动时必须先固化模式和客户端间的通信接口,即通信接口是固定不变的。分析变动就是分析模式的易碎性(模式实现适应变动的能力)。对抽象工厂模式可以考虑两个变动:
  1. 加一个产品类族;
  2. 加一个产品类。
  变动一的易碎性较小,我们只需在每个产品类层次中增加这个产品族中产品类作为抽象产品类的子类,同时增加一个工厂子类来创建这个产品类族的产品族足以。
  变动二要求在模式中增加一个产品类,意味着增加一个产品类层次。由于通信接口中的工厂方法固定了客户能创建的产品的类型数目,所以增加一个产品类意味着修改与客户端的通信接口,进一步意味着旧的客户端要使用新的模式实现就要重新编码,整个工厂类层次都需要改动。综合上述,这个变动的易碎性很大。
  设计
  程序架构
  一个程序可以从三个维度进行架构,这三个维度是层、级和服务。层代表了不同的抽象程度,比如操作系统的分层;级代表不同的角色和职责,比如Client/Server的两级模型;服务代表了具有通用功能的支持模块。

2011-09-28 19:00
阅读:
I'm VC , Just U know Y
本站部分文章来源于互联网,版权归原作者所有。

延伸阅读:

用Java程序编写记事本

不用spring,hibernate超傻瓜JAVA开发(javabean+数组)

用Java编写计算器的几种常见的做法

proxool.default (HouseKeeper.java:149)异常解决办法

九大因素让Java EE 6成为你的省钱法宝