抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
场景
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
实现
源码来自于《设计模式之禅》
抽象产品类A
public abstract class AbstractProductA {
public void shareMethod(){
// 每个产品共有的方法
}
public abstract void doSomething();
}
产品A1的实现类
public class ProductA1 extends AbstractProductA {
@Override
public void doSomething() {
System.out.println("产品A1的实现方法");
}
}
产品A2的实现类
public class ProductA2 extends AbstractProductA {
@Override
public void doSomething() {
System.out.println("产品A2的实现方法");
}
}
抽象产品类B
public abstract class AbstractProductB {
public void shareMethod(){
// 每个产品共有的方法
}
public abstract void doSomething();
}
产品B1的实现类
public class ProductB1 extends AbstractProductB {
@Override
public void doSomething() {
System.out.println("产品B1的实现方法");
}
}
产品B2的实现类
public class ProductB2 extends AbstractProductB {
@Override
public void doSomething() {
System.out.println("产品B2的实现方法");
}
}
抽象工厂类
public abstract class AbstractCreator {
/** 创建A产品家族 */
public abstract AbstractProductA createProductA();
/** 创建B产品家族 */
public abstract AbstractProductB createProductB();
}
有N个产品族,在抽象共产类中就应该有N个创建方法。
实现产品等级1的实现类
public class Creator1 extends AbstractCreator {
/** 只生产产品等级为1的A产品 */
public AbstractProductA createProductA() {
return new ProductA1();
}
/** 只生产产品等级为1的B产品 */
public AbstractProductB createProductB() {
return new ProductB1();
}
}
实现产品等级2的实现类
public class Creator2 extends AbstractCreator {
/** 只生产产品等级为2的A产品 */
public AbstractProductA createProductA() {
return new ProductA2();
}
/** 只生产铲平等级为2的B产品 */
public AbstractProductB createProductB() {
return new ProductB2();
}
}
有M个产品等级就应该有M个实现工厂类,在每个实现工厂类中实现不同产品族的生产创造
优点
- 封装性,每个产品的实现类不是上层模块要关心的,它不关心对象是如何创建出来,只需要关心接口抽象
- 产品族内的约束为非公开状态,生产过程对调用工厂类的高层模块来说是透明的
缺点
- 产品族扩展非常困难,如果要增加一个产品C,也就是说有产品家族由原来的2个,增加到3个,抽象类AbstractCreator要增加一个方法createProductC(),然后,两个实现类都要修改,严重违反了开闭原则
工厂方法模式与抽象工厂模式比较
- 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性。
- 抽象工厂模式则可以提供多个产品对象,而不是单一的产品对象。
Android 中的应用
暂未找到合适的例子
掘金看到:WebViewFactoryProvider和WebViewChromiumFactoryProvider,未做深入
参考
书籍:《设计模式之禅》、《Android源码设计模式》
技术文章:菜鸟教程-设计模式