现在我们假设一种场景,有个水果商人,他想买一些水果,包括苹果、香蕉、西红柿,这时候使用工厂模式我们只要像苹果工厂、香蕉工厂、西红柿工厂提出订单即可,水果自然就生产出来了,但是如果这时候,商人为了扩大档次,想要进口美国的上面三种水果,这时候如果还是使用工厂模式,就不得不向美国的三家水果工厂提出订单,如果这时候又要日本的水果,又要创建三个日本的水果工厂。这样下去,工厂的种类将是以三倍速度增长,类的种类扩大很多。但是如果使用抽象工厂模式,我只需要向某个国家的工厂提交订单,让他们帮忙生产他们国家的三种水果即可,这样设计是不是简单了很多呢。
其实抽象工厂模式就是对工厂模式的一种改进,增加了工厂生产产品的种类,减少了冗余代码,提高了程序效率。适应于产品族生产的场景。
类图如下:
事例代码如下:
#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;
}
运行结果如下: