这篇文章介绍设计模式中的 工厂方法模式。
前面两篇文章介绍了简单工厂模式的介绍和实现。
本文同样以汽车厂生产汽车为例介绍工厂方法模式。
代码如下:
#include <iostream>
#include <string>
#include <assert.h>
using namespace std;
// Abstract Product
class CarBase
{
public:
// 虚函数 实现多态
virtual ~CarBase(){}
virtual void printName()
{
cout << "汽车厂商:" << m_Name << endl;
}
// 声明为protected
protected:
string m_Name;
// 构造函数声明为protected 保证基类在外部不可实例化 必须继承
CarBase(){}
CarBase(const string& name) :m_Name(name){}
};
// 产品1
class GMCar : public CarBase
{
public:
// 声明构造函数为public
GMCar() :CarBase("通用汽车公司"){}
void printName()
{
cout << "GMCar" << endl;
CarBase::printName();
}
};
// 产品2
class FordCar : public CarBase
{
public:
// 声明构造函数为public
FordCar() :CarBase("福特汽车公司"){}
void printName()
{
cout << "FordCar" << endl;
CarBase::printName();
}
};
// 抽象工厂类 定义创建产品的接口
class IFactory
{
public:
virtual CarBase* create() = 0; // 虚函数
};
class GMFactory :public IFactory
{
public:
CarBase* create()
{
return new GMCar();
}
};
class FordFactory :public IFactory
{
public:
CarBase* create()
{
return new FordCar();
}
};
void testFactoryMethodMode()
{
IFactory* pFactory = NULL; // 抽象基类指针
CarBase* pCar = NULL; // 基类指针
// 栈分配 工厂实例类对象
GMFactory gmFactory;
FordFactory fordFactory;
pFactory = &gmFactory;
pCar = pFactory->create();
pCar->printName();
delete pCar; // 避免内存泄露
pFactory = &fordFactory;
pCar = pFactory->create();
pCar->printName();
delete pCar;
// 注意内存泄露
pCar = NULL;
pFactory = NULL;
}
int main(void)
{
testFactoryMethodMode();
return 0;
}