定义:
- 为创建一组相关或者相互依赖的对象提供接口,而且无须指定它们的具体类。
通用的表示形式:
- ps:图中的1、2表示等级,A、B表示产品的类型,通过不同的维度做出对应的抽象。
public abstract class AbstractProductA {
// 定义公共方法
public void sharedMethod() {
}
// 产品实现的特定方法
public abstract void doOwnThing();
}
public abstract class AbstractProductB {
// 定义公共方法
public void sharedMethod() {
}
// 产品实现的特定方法
public abstract void doOwnThing();
}
public class ProductA1 extends AbstractProductA {
@Override
public void doOwnThing() {
// TODO Auto-generated method stub
}
}
public class ProductA2 extends AbstractProductA {
@Override
public void doOwnThing() {
// TODO Auto-generated method stub
}
}
public class ProductB1 extends AbstractProductB {
@Override
public void doOwnThing() {
// TODO Auto-generated method stub
}
}
public class ProductB2 extends AbstractProductB {
@Override
public void doOwnThing() {
// TODO Auto-generated method stub
}
}
//有N个产品家族,在抽象工厂类中就应该有N个创建方法
public abstract class AbstractCreator {
// 产品a家族
public abstract AbstractProductA createProductA();
// 产品b家族
public abstract AbstractProductB createProductB();
}
/*
* 有多少个产品等级,就有多少个实现类
* 创建等级1的产品
* */
public class Creator1 extends AbstractCreator {
@Override
public AbstractProductA createProductA() {
// TODO Auto-generated method stub
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
// TODO Auto-generated method stub
return new ProductB1();
}
}
/*
* 创建等级2产品
* */
public class Creator2 extends AbstractCreator {
@Override
public AbstractProductA createProductA() {
// TODO Auto-generated method stub
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
// TODO Auto-generated method stub
return new ProductB2();
}
}
//情景实用类
public class Client {
public static void main(String[] args) {
//获得两个对应的工厂类
AbstractCreator c1 = new Creator1();
AbstractCreator c2 = new Creator2();
//获得对应的产品对象
AbstractProductA a1= c1.createProductA();
AbstractProductA a2 = c2.createProductA();
}
}
优点:
- 具有良好的封装性,高层模块关心的是接口和抽象,并不关心具体的实现类。
- 可以实现产品族内的约束为非公开状态,对于内部产品的生产约束状态,高层的模块不需要知晓。
缺点:
- 严重违反了开闭原则,产品族的拓展难度较大(产品等级的拓展非常容易)
最佳实践:
使用抽象工厂模式,屏蔽掉不同的因素对应用的影响。