这篇文章主要介绍 简单工厂模式 。
下面是关于汽车厂生产汽车的一个典型案例。
代码如下:
#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:
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 CarFactory
{
public:
// 创建实体类对象的接口(static)
// 参数不一定用string类型 对应即可
static CarBase* create(const string& name)
{
// 基类指针
CarBase* car = NULL;
// **问题:客户程序员需要知道子类的名字
// 根据类型创建实体类
if ("GM" == name)
{
car = new GMCar();
}
else if ("Ford" == name)
{
car = new FordCar();
}
else
{
assert(false);
}
return car;
}
};
void testSimpleFactoryMode()
{
CarBase* car = CarFactory::create("GM");
car->printName();
delete car; // 防止内存泄露
car = CarFactory::create("Ford");
car->printName();
delete car;
//car = CarFactory::create("unknown");
//car->printName();
//delete car;
}
int main(void)
{
testSimpleFactoryMode();
return 0;
}