抽象工厂模式和工厂方法模式类似,因此也被称为工厂家族模式,属于创建型设计模式。
定义:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。
以下的例子说明:
市场上有神奇公司和希望公司,他们同时可以生产鼠标和电池,但是两个公司的鼠标和电池型号却是不一样的。
IMouseProduct(抽象鼠标产品)
IBatteryProduct(抽象电池产品)
-----------------------------------------------------------------
MagicBattery(神奇公司具体电池产品)
MagicMouse(神奇公司具体鼠标产品)
HopeBattery(希望公司具体电池产品)
HopeMouse(希望公司具体鼠标产品)
---------------------------------------------------------------
IFactory(抽象工厂)
MagicFactory(神奇公司工厂-生产神奇鼠标和电池)
HopeFactory(希望公司工厂-生产希望鼠标和电池)
代码:
#include <iostream>
using namespace std;
//抽象鼠标
class IMouseProduct{
public:
virtual void createMouse() = 0;
};
//抽象电池
class IBatteryProduct{
public:
virtual void createBattery() = 0;
};
//神奇公司电池
class MagicBattery :public IBatteryProduct
{
public:
virtual void createBattery(){
cout << "生产神奇电池" << endl;
}
};
//神奇公司鼠标
class MagicMouse :public IMouseProduct
{
public:
virtual void createMouse(){
cout << "生产神奇鼠标" << endl;
}
};
//希望公司电池
class HopeBattery :public IBatteryProduct
{
public:
virtual void createBattery(){
cout << "生产希望电池" << endl;
}
};
//希望公司鼠标
class HopeMouse :public IMouseProduct
{
public:
virtual void createMouse(){
cout << "生产希望鼠标" << endl;
}
};
//抽象工厂
class IFactory
{
public:
virtual IMouseProduct *createMouseProuct() = 0;
virtual IBatteryProduct *createBatteryProduct() = 0;
};
//神奇工厂 生产鼠标和键盘
class MagicFactory :public IFactory
{
public:
virtual IMouseProduct *createMouseProuct()
{
return new MagicMouse;
}
virtual IBatteryProduct *createBatteryProduct()
{
return new MagicBattery;
}
};
//希望工厂 生产鼠标和键盘
class HopeFactory :public IFactory
{
public:
virtual IMouseProduct *createMouseProuct()
{
return new HopeMouse;
}
virtual IBatteryProduct *createBatteryProduct()
{
return new HopeBattery;
}
};
//客户端
int main()
{
//神奇工厂
//IFactory *fac = new MagicFactory;
//希望工厂
IFactory *fac = new HopeFactory;
if (fac)
{
fac->createBatteryProduct()->createBattery();
fac->createMouseProuct()->createMouse();
delete fac;
fac = nullptr;
}
return 0;
}
可以看到在客户端中,只需要实例化对应的具体工厂对象给IFactory即可生产不同的产品,不需要改变其他的代码。