定义

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。)

  1. /**
  2. * 抽象产品类
  3. */
  4. public abstract class AbstractProductA {
  5. // 每个产品共有的方法
  6. public void shareMethod(){}
  7. // 每个产品相同的方法,不同的实现
  8. public abstract void doSomrthing();
  9. }
  1. /**
  2. * 产品类A的实现类A1
  3. */
  4. public class ProductA1 extends AbstractProductA{
  5. @Override
  6. public void doSomrthing() {
  7. System.out.println("产品A1的实现");
  8. }
  9. }
  1. /**
  2. * 产品类A的实现类A2
  3. */
  4. public class ProductA2 extends AbstractProductA{
  5. @Override
  6. public void doSomrthing() {
  7. System.out.println("产品A2的实现");
  8. }
  9. }
  1. /**
  2. * 抽象工厂类
  3. */
  4. public abstract class AbstractCreator {
  5. // 创建A产品家族
  6. public abstract AbstractProductA createProductA();
  7. // 创建B家族产品
  8. }
  1. /**
  2. * 产品等级1的实现类
  3. */
  4. public class Creator1 extends AbstractCreator{
  5. // 只生产产品等级为1的A产品
  6. @Override
  7. public AbstractProductA createProductA() {
  8. return new ProductA1();
  9. }
  10. // 只生产产品等级为1的B产品
  11. // public AbstractProductB createProductA() {
  12. // return new ProductB1();
  13. // }
  14. }
  15. /**
  16. * 产品等级2的实现类
  17. */
  18. public class Creator2 extends AbstractCreator{
  19. // 只生产产品等级为2的A产品
  20. @Override
  21. public AbstractProductA createProductA() {
  22. return new ProductA2();
  23. }
  24. // 只生产产品等级为2的B产品
  25. // public AbstractProductB createProductA() {
  26. // return new ProductB2();
  27. // }
  28. }

抽象工厂模式的应用

抽象工厂模式的优点

  • 封装性
  • 产品族内的约束为非公开状态

抽象工厂模式的缺点

  • 抽象工厂模式最大的缺点就是产品族扩展非常困难

抽象工厂模式的使用场景

抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如,AbstractProductA是微信,ProductA1是windows版本,ProductA2是mac版本