目录

  • 简介
  • 包含角色
  • UML类图
  • java实现
  • 优缺点
  • 工厂模式和抽象工厂模式区别

1. 简介

围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂

2. 包含角色

2.1 抽象产品角色:

担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口

2.2 具体产品角色:

抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑

2.3 抽象工厂角色:

担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的

2.4 具体工厂角色:

这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的


3. UML类图

设计模式---抽象工厂方法

4. java实现

4.1 抽象产品角色(ProductA)

/**
 * @program: pattern
 * @description: 抽象产品角色
 * @author: chengqj
 * @create: 2018-08-06 19:58
 **/
public interface ProductA {
}

4.2 抽象产品角色(ProductB)

/**
 * @program: pattern
 * @description: 抽象产品角色
 * @author: chengqj
 * @create: 2018-08-06 19:58
 **/
public interface ProductB {
}

4.3 具体产品角色(EntityProductA)

/**
 * @program: pattern
 * @description: 具体产品角色
 * @author: chengqj
 * @create: 2018-08-06 19:59
 **/
public class EntityProductA implements ProductA{
}

4.4 具体产品角色(EntityProductB)

/**
 * @program: pattern
 * @description: 具体产品角色
 * @author: chengqj
 * @create: 2018-08-06 20:00
 **/
public class EntityProductB implements ProductB{
}

4.5 抽象工厂角色(AbstractFactory)

/**
 * @program: pattern
 * @description: 抽象产品角色
 * @author: chengqj
 * @create: 2018-08-06 20:01
 **/
public interface AbstractFactory {
    ProductA getProductAInstance();

    ProductB getProductBInstance();
}

4.6 具体工厂角色(EntityFactory)

/**
 * @program: pattern
 * @description: 具体产品角色
 * @author: chengqj
 * @create: 2018-08-06 20:02
 **/
public class EntityFactory implements AbstractFactory {
    @Override
    public ProductA getProductAInstance() {
        return new EntityProductA();
    }

    @Override
    public ProductB getProductBInstance() {
        return new EntityProductB();
    }
}

4.7 测试

public static void main(String[] args) {
    AbstractFactory factory = new EntityFactory();
    ProductA productA = factory.getProductAInstance();
    ProductB productB = factory.getProductBInstance();
}

5.8 扩展流程

  1. 新的具体产品类分别继承ProductA和ProductB
  2. 实现新的AbstractFactory接口,分别创建新的具体产品角色

6. 优缺点

6.1 优点:

除了工厂模式中的优点之外,可以在类的内部对产品族进行约束

6.2 缺点:

产品族的扩展将是一件十分费力的事情, 假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改

7. 工厂模式和抽象工厂模式区别

7.1 工厂方法模式

  1. 一个抽象产品类,可以派生出多个具体产品类。
  2. 一个抽象工厂类,可以派生出多个具体工厂类。
  3. 每个具体工厂类只能创建一个具体产品类的实例。

7.2 抽象工厂模式:

  1. 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
  2. 一个抽象工厂类,可以派生出多个具体工厂类。
  3. 每个具体工厂类可以创建多个具体产品类的实例

7.3 区别

  1. 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
  2. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

相关文章: