定义
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{@Overridepublic void doSomrthing() {System.out.println("产品A1的实现");}}
/*** 产品类A的实现类A2*/public class ProductA2 extends AbstractProductA{@Overridepublic void doSomrthing() {System.out.println("产品A2的实现");}}
/*** 抽象工厂类*/public abstract class AbstractCreator {// 创建A产品家族public abstract AbstractProductA createProductA();// 创建B家族产品}
/*** 产品等级1的实现类*/public class Creator1 extends AbstractCreator{// 只生产产品等级为1的A产品@Overridepublic AbstractProductA createProductA() {return new ProductA1();}// 只生产产品等级为1的B产品// public AbstractProductB createProductA() {// return new ProductB1();// }}/*** 产品等级2的实现类*/public class Creator2 extends AbstractCreator{// 只生产产品等级为2的A产品@Overridepublic AbstractProductA createProductA() {return new ProductA2();}// 只生产产品等级为2的B产品// public AbstractProductB createProductA() {// return new ProductB2();// }}
抽象工厂模式的应用
抽象工厂模式的优点
- 封装性
- 产品族内的约束为非公开状态
抽象工厂模式的缺点
- 抽象工厂模式最大的缺点就是产品族扩展非常困难
抽象工厂模式的使用场景
抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如,AbstractProductA是微信,ProductA1是windows版本,ProductA2是mac版本
