抽象工厂模式
一、定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类
抽象工厂方法的通用类图如下
抽象工厂模式是工厂方法模式的升级版本,应用于多个业务品种、业务分类产生对象的情况。
下面为通用源代码类图与其代码
通用源代码类图
有两个相互影响的产品线(产品族,即不同的产品,如汽车发动机和方向盘)ProductA、ProductB
,每个产品有连个登记,ProductX1、ProductX2,有2个工厂类Creator1、Creator2用于创建来个等级的产品,Creator1生产
抽象产品类ProductA1、ProductB1,所以Creator1依赖ProductA1、ProductB1,Creator2同样。
通用源码
public abstract class AbstractProductA {
//每个产品共有的方法
public void shareMethod(){
}
//每个产品相同方法,不同实现
public abstract void doSomething();
}
产品A1的实现类
public class ProductA1 extends AbstractProductA {
public void doSomething() {
System.out.println("产品A1的实现方法");
}
}
产品A2的实现方式
public class ProductA2 extends AbstractProductA {
public void doSomething() {
System.out.println("产品A2的实现方法");
}
}
产品B与A类似
抽象工厂类AbstractCreator的职责是定义每个工厂要实现的功能
public abstract class AbstractCreator {
//创建A产品家族
public abstract AbstractProductA createProductA();
//创建B产品家族
public abstract AbstractProductB createProductB();
}
等级为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();
}
}
与实现无关的场景类Client
public class Client {
public static void main(String[] args) {
//定义出两个工厂
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
//产生A1对象
AbstractProductA a1 = creator1.createProductA();
//产生A2对象
AbstractProductA a2 = creator2.createProductA();
//产生B1对象
AbstractProductB b1 = creator1.createProductB();
//产生B2对象
AbstractProductB b2 = creator2.createProductB();
/*
* 然后在这里就可以为所欲为了...
*/
}
}
在场景类中,没有任何一个方法与实现类有关系,我们只要知道它的工厂方法就可以直接产生一个产品对象,无须关心它的实现类。
二、抽象工厂的优点
-
封装性
高层模块不需要关心每个产品的实现类,只要知道哪个工厂类能创建出一个需要的对象即可
-
产品族内的约束为非公开状态
例如一个发动机对应一个方向盘,但需要对应四个轮子,具体的产品族内的约束是在工厂内实现的。
三、抽象工厂的缺点
-
产品族扩展困难
如上面要增加一个产品C,则需要在抽象类AbstractCreator增加一个createProductC(),然后两个工厂实现类都需要修改,所有与契约有关系的代码都要修改。
其实上面与现实相似,比如说一个工厂有两个电脑生产工厂,生产电脑外壳和电池,现在老板要扩展生产线,生产电脑蓝牙设备,那么每个工厂都要添加生产蓝牙设备的车间(生产方法),这样一个工厂产出的物品才是完整地(在一个工厂需要产出组合完整地产品的前提下)
四、使用场景
一个对象族都有相同的约束,就可以使用抽象工厂模式。
生产工厂,生产电脑外壳和电池,现在老板要扩展生产线,生产电脑蓝牙设备,那么每个工厂都要添加生产蓝牙设备的车间(生产方法),这样一个工厂产出的物品才是完整地(在一个工厂需要产出组合完整地产品的前提下)