定义
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。)
/**
* 抽象产品类
*/
public abstract class AbstractProductA {
// 每个产品共有的方法
public void shareMethod(){}
// 每个产品相同的方法,不同的实现
public abstract void doSomrthing();
}
/**
* 产品类A的实现类A1
*/
public class ProductA1 extends AbstractProductA{
@Override
public void doSomrthing() {
System.out.println("产品A1的实现");
}
}
/**
* 产品类A的实现类A2
*/
public class ProductA2 extends AbstractProductA{
@Override
public void doSomrthing() {
System.out.println("产品A2的实现");
}
}
/**
* 抽象工厂类
*/
public abstract class AbstractCreator {
// 创建A产品家族
public abstract AbstractProductA createProductA();
// 创建B家族产品
}
/**
* 产品等级1的实现类
*/
public class Creator1 extends AbstractCreator{
// 只生产产品等级为1的A产品
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
// 只生产产品等级为1的B产品
// public AbstractProductB createProductA() {
// return new ProductB1();
// }
}
/**
* 产品等级2的实现类
*/
public class Creator2 extends AbstractCreator{
// 只生产产品等级为2的A产品
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
// 只生产产品等级为2的B产品
// public AbstractProductB createProductA() {
// return new ProductB2();
// }
}
抽象工厂模式的应用
抽象工厂模式的优点
- 封装性
- 产品族内的约束为非公开状态
抽象工厂模式的缺点
- 抽象工厂模式最大的缺点就是产品族扩展非常困难
抽象工厂模式的使用场景
抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如,AbstractProductA是微信,ProductA1是windows版本,ProductA2是mac版本