概述
抽象工厂模式是一种创建型设计模式,抽象工厂模式与工厂方法模式的主要区别是工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
抽象工厂模式是工厂方法模式的升级版本,用来创建一组相关或者相互依赖的对象.工厂方法模式产生的产品都衍生自同一个接口或抽象类
,而抽象工厂模式则是衍生自不同的接口或抽象类.
定义
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定他们的具体类.
适用场景
- 当需要创建的对象是一系列相互关联或相互依赖的产品族时(一个继承体系中,存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束).
UML
其中涉及到的角色
- AbstractFactory : 抽象工厂角色,声明了一组用于创建一种产品的方法,每一个方法对应一个产品.
- ConcreteFactory : 具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生成一组具体的产品.
- AbstractProduct : 抽象产品角色,它为每种产品声明接口.
- ConcreteProduct : 具体产品角色,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法.
实例
如下是一个抽象工厂模式的通用代码,
- 首先定义抽象产品类
public abstract class AbstractProductA {
public abstract void method();
}
public abstract class AbstractProductB {
public abstract void method();
}
- 具体产品类
public class ConcreteProductA extends AbstractProductA {
private static final String TAG = "ConcreteProductA";
@Override public void method() {
Log.d(TAG, "method: --> 具体产品 A 的方法");
}
}
public class ConcreteProductB extends AbstractProductB {
private static final String TAG = "ConcreteProductB";
@Override public void method() {
Log.d(TAG, "method: --> 具体产品 B 的方法");
}
}
- 抽象工厂类
public abstract class AbstractFactory {
public abstract AbstractProductA createAbstractFactoryA();
public abstract AbstractProductB createAbstractFactoryB();
}
- 具体工厂类
public class ConcreteFactory extends AbstractFactory {
@Override public AbstractProductA createAbstractFactoryA() {
return new ConcreteProductA();
}
@Override public AbstractProductB createAbstractFactoryB() {
return new ConcreteProductB();
}
}
- 客户端调用
AbstractFactory abstractFactory = new ConcreteFactory();
AbstractProductA abstractFactoryA = abstractFactory.createAbstractFactoryA();
AbstractProductB abstractFactoryB = abstractFactory.createAbstractFactoryB();
abstractFactoryA.method();
abstractFactoryB.method();
抽象工厂模式的优缺点
优点
- 抽象工厂模式分离了接口与实现,客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁.非常解耦
- 可以在类的内部对产品族进行约束,抽象工厂在类内部对产品族的关联关系进行定义和描述
缺点
- 和所有涉及模式形似,使用抽象工厂模式类文件会爆炸性增加
- 不太容易扩展新的产品类,每增加一个产品类就需要修改抽象工厂.所有的具体工厂都会被修改.
总结
抽象工厂模式生产的产品属于某一个产品族,这里的产品族.所谓的产品族是指 位于不同产品等级结构中功能相关联的产品组成的家族 .而工厂方法模式生产的产品则是同一等级结构的产品.无论是工厂方法模式还是抽象工厂模式都属于工厂模式,最终的目的都是为了解耦,在实际开发中这两者是可以相互改变的.