抽象工厂模式可以向客户提供接口,使得客户端在不必指定产品具体类型的情况下创建多个产品族中的产品对象。
系统的设计
采用抽象工厂模式设计出的系统类图如下:
从上图可以看出,抽象工厂模式涉及到角色:
抽象工厂角色(AbstractFactory):担任这个角色的是工厂方法模式的核心,它与应用系统的商业逻辑无关。通常使用Java接口或者抽象Java类实现,而所有的具体工厂类都必须实现这个Java接口或者继承这个抽象Java类。
具体工厂类(ConcreteFactory)角色:这个角色直接在客户端的调用下创建产品实例。这个角色包含有选择合适的产品对象的逻辑,而这个逻辑与应用系统的商业逻辑紧密相关的。通常使用具体Java类实现这个角色。
抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或他们共同拥有的接口。通常使用Java接口或者抽象Java类实现这一角色。
具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体Java类实现这个角色。
工厂角色源代码
public interface Creater {
/**
* 产品等级A的工厂方法
* @author 付玉伟
* @time 2015-3-21 下午05:03:14
* @return
*/
public ProductA factoryA();
/**
* 产品等级B的工厂方法
* @author 付玉伟
* @time 2015-3-21 下午05:03:31
* @return
*/
public ProductB factoryB();
}
具体的工厂角色(一般而言,有多少个产品等级结构,就会在工厂角色中发现多个个工厂方法,每一个产品等级结构中有多少个具体的产品,就有多少个产品族,也就会在工厂等级结构发现多少个具体的工厂)
public class ConcreteCreator1 implements Creater {
public ProductA factoryA() {
return new ProductA1();
}
public ProductB factoryB() {
return new ProductB1();
}
}
public class ConcreteCreatro2 implements Creater {
public ProductA factoryA() {
return new ProductA1();
}
public ProductB factoryB() {
return new ProductB1();
}
}
public interface ProductA {
}
public interface ProductB {
}
public class ProductA1 implements ProductA {
public ProductA1(){
}
}
public class ProductA2 implements ProductA {
public ProductA2(){
}
}
public class ProductB1 implements ProductB {
public ProductB1(){
}
}
public class ProductB2 implements ProductB {
public ProductB2(){
}
}
客户端需要的不是工厂,而是具体的产品。在真实的系统中,产品类应当与应用系统的商业逻辑有密切的关系。
在什么情况下使用抽象工厂模式?
1、一个系统不应单依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2、这个系统的产品有多于一个的产品族,而系统中只消费其中某一族的产品
3、同属于同一个产品族的产品是在一起使用的,这一约束必须在系统设计中体现出来
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现