现在我们假设一种场景,有个水果商人,他想买一些水果,包括苹果、香蕉、西红柿,这时候使用工厂模式我们只要像苹果工厂、香蕉工厂、西红柿工厂提出订单即可,水果自然就生产出来了,但是如果这时候,商人为了扩大档次,想要进口美国的上面三种水果,这时候如果还是使用工厂模式,就不得不向美国的三家水果工厂提出订单,如果这时候又要日本的水果,又要创建三个日本的水果工厂。这样下去,工厂的种类将是以三倍速度增长,类的种类扩大很多。但是如果使用抽象工厂模式,我只需要向某个国家的工厂提交订单,让他们帮忙生产他们国家的三种水果即可,这样设计是不是简单了很多呢。

其实抽象工厂模式就是对工厂模式的一种改进,增加了工厂生产产品的种类,减少了冗余代码,提高了程序效率。适应于产品族生产的场景。

类图如下:


事例代码如下:

#include <iostream>
using namespace std;

/* 抽象产品类 */
class AbstractProduct {
public:
    virtual ~AbstractProduct() { }
    virtual void Operation() = 0;
};


/* 具体产品类 */
class ProductA :public AbstractProduct {
public:
    void Operation() {
        cout << "ProductA Operation" << endl;
    }
};


/* 具体产品类 */
class ProductB :public AbstractProduct {
public:
    void Operation() {
        cout << "ProductB Operation" << endl;
    }
};

/* 抽象工厂类 */
class AbstractFactory {
public:
    virtual ~AbstractFactory() { }
    virtual AbstractProduct* CreateProductA() = 0;
    virtual AbstractProduct* CreateProductB() = 0;
};

/* 具体工厂类A,可生产某种产品族 */
class ConcreteFactory :public AbstractFactory {
public:
    AbstractProduct* CreateProductA() {
        return new ProductA();
    }

    AbstractProduct* CreateProductB() {
        return new ProductB();
    }
};

int main() {
    AbstractFactory *factory = new ConcreteFactory();
    AbstractProduct* productA = factory->CreateProductA();
    AbstractProduct* productB = factory->CreateProductB();
    productA->Operation();
    productB->Operation();

    delete factory;
    delete productA;
    delete productB;

    return 0;
}

运行结果如下: