通过抽象工厂模式,可以处理具有相同或相似等级结构的多个产品族中的产品对象的创建问题。
抽象工厂模式的结构
从上图可以看出,抽象工厂模式涉及到以下角色:
- 抽象工厂角色(AbstractFactory): 通常使用java接口或者抽象类实现,是该模式的核心,与应用系统的商业逻辑无关。
- 具体工厂类角色(Concrete Factory): 这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑与应用系统的商业逻辑紧密相关。通常用具体java类实现。
- 抽象产品角色(Abstract Product): 担任这个角色的是模式所创建产品对象的父类,或它们共同拥有的接口。通常使用java接口或java抽象类实现。
- 具体产品角色(Concrete Product): 抽象工厂模式所创建的任何产品对象都是某个具体产品类的实例。
示意性源码
可以看出抽象工厂角色规定了两个工厂方法,分别提供两个不同等级结构的产品的对象。
一般而言,有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法。
每一个产品等级结构中有多少具体产品,就有多少个产品族,也就会在工厂等级结构中发现多少个具体工厂。
抽象工厂模式在农场系统的实现
在这个系统里产品分为两个等级结构:水果(Fruit)和蔬菜(Veggie).
水果类图
蔬菜类图
下图是描述这个系统的产品角色的相图
可以看出,这个系统的产品可以分成两个等级结构:Fruit和Veggie,
以及两个产品族:Tropical 和 Northern .
园丁等级结构类图:
系统设计图如下:
源码如下