定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
/** 通用源码 */
// 抽象产品类A
public abstract class AbstractProductA{
// 每个产品共有的方法
public void shareMethod(){
}
// 每个产品相同方法、不同实现
public abstract void doSomething();
}
// 产品A1[ProductA1]的实现类:略
// 产品A2[ProductA2]的实现类:略
// 抽象产品类B
public abstract class AbstractProductB{
// 每个产品共有的方法
public void shareMethod(){
}
// 每个产品相同方法、不同实现
public abstract void doSomething();
}
// 产品B1[ProductB1]的实现类:略
// 产品B2[ProductB2]的实现类:略
// 抽象工厂类
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个实现工厂类,在每个实现工厂中,实现不同产品族的生产任务 */
// 场景类0
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();
/*
* 业务逻辑······
*/
}
}
// 在场景类中,没有任何一个方法与实现类有关系,对于一个产品来说,我们只要知道它的工厂方法就可以直接生产一个产品对象,无须关心它的实现类。
-
抽象工厂模式的优点
封装性,高层模块不关心具体实现类,只关心接口/抽象,对象的创建由工厂类去实现,只要知道工厂类就可以创建出所需要的对象;
产品族内的约束为非公开状态,调用工厂类对于高层模块来说是透明的,高层模块无须知道工厂中的约束。
-
抽象工厂模式的缺点
扩展产品族很困难,会违反开闭原则。
-
抽象工厂模式的使用场景
一个对象族(或是一组没有关系的对象)都有相同的约束,就可以使用抽象工厂模式。例如针对不同操作系统类型实现文本编辑器和图片编辑器,文本编辑器和图片编辑器就有了共同的约束条件:操作系统类型。
-
抽象工厂模式的注意事项
注意是产品族扩展困难,不是产品等级。产品等级的扩展是容易的,直接新增一个对应工厂类来实现生产任务就行;
就是说横向扩展容易,纵向扩展难。