如果要严格按照DIP思想进行编程,那么就要对所有易变类使用工厂。如果有必要使用Proxy模式,那么可以使用工厂模式去创建持久化对象,如果要在单元测试过程中添加一个测试桩(欺骗对象),这时也可以通过工厂模式来实现。使用工厂会带来一定的复杂度,但是这些都是可以避免的,尤其是在设计初期。

工厂模式允许我们只依赖于抽象接口就能创建出具体对象的实例。该模式对于高度易变的类特别有效。下面是一个具体的例子:

假设我们要封装一组文本框控件,如下图:

 

以上是一个简单工厂的常用实现方法,下面介绍一下抽象工厂模式,,抽象工厂模式涉及到以下的角色。

抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用Java 接口或者抽象Java 类实现,而所有的具体工厂类必须实现这个Java 接口或继承这个抽象Java 类。

具体工厂类(Conrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体Java 类实现这个角色。

抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java 接口或者抽象Java 类实现这一角色。

具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体Java 类实现这个角色。

考虑以上例子,我们加入对按钮控件的处理

 

抽象工厂模式的应用场合

(1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的;

(2)这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;

(3)同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体现出来;

(4)系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

 posted on 2010-06-15 09:03  James Cheung  阅读(547)  评论(0编辑  收藏  举报