2009年4月1日星期三

JavaDesign_003:简单工厂模式 Simple Factory (摘录+整理)

1. 特点
(1)工厂类用静态方法根据业务逻辑“生产“具体产品类。工厂类依赖于具体产品类。
(2)具体产品类继承抽象产品类或实现产品接口。选择哪个,视情况而定。
如果具体产品类之间没有共同的逻辑,那么可以让所有具体产品类实现一个产品接口。
否则,应该让所有具体产品类继承一个抽象产品类,并且把公共逻辑放到抽象产品类中。
(3)抽象产品类或产品接口只有一个,具体产品类全部继承抽象产品类或实现产品接口。
(4)工厂类只有一个
(5)工厂方法可以有多个,但返回类型都是同一个抽象产品类或产品接口。

2. 优点
(1)产品使用者无需“生产”产品,只需“消费”产品。
(2)当需要增加产品时,产品使用者代码无需改变。
(3)工厂方法是静态的,产品使用者可以直接调用。
注:(1)(2)是所有工厂模式的共同的优点。

3. 缺点
(1)工厂方法是静态的,子类无法继承。
(2)当需要增加具体产品类时,工厂代码需要改变。
(3)当具体产品类越来越多时,工厂代码将过于全知全能和臃肿。

4. 典型应用场景
(1)动态类装载器。

问题1:何时使用“继承抽象类”,何时使用“实现接口”?
满足以下条件才可以使用继承:
(1)子类是超类的一个特殊种类。Is-A,NOT Has-A,Has-A是聚合关系。
(2)Java不允许子类有多个超类,所以务必确定该子类将来不会出现这种要求。
(3)子类主要的责任是扩展超类,而不是大量置换(Override)超类的方法,虽然Java支持Override。
(4)能够从一般常识解释该子类和超类的关系。比如,不要为了一时方便,从工具类继承,以获得方法重用。

问题2:使用“继承抽象类”时应该注意的问题?
(1)公共逻辑尽可能地集中到抽象类中,为了复用。
(2)数据对象尽可能地留到具体类中创建,减少资源占用。
用一句话说就是,将行为尽可能地移动到结构的高端,而将状态尽可能地移动到结构的低端。

参考文献:
1. 《设计模式》 板桥里人
2. 《Java与模式》 阎宏

没有评论: