工厂方法模式
在简单工厂模式中,每次增加一个具体产品,都需要修改工厂的判断代码。工厂方法模式不采用一个工厂生产具体产品,而是针对不同的产品设计不同的工厂,每个工厂只生产特定的产品。这种方式遵循开闭原则。
举个例子,如图所示,客户想选择打篮球、足球和排球,这时他只需要到篮球室、足球室和排球室拿到相应的球,并不需要关心篮球、足球和排球是如何产生的。

工厂模式的UML实例图如下图:

从上面可以看出,工厂方法模式需要4个元素:
- 抽象工厂(AbstractFactory):所有生产具体产品的工厂类的基类,提供工厂类的公共方法。
- 具体工厂(ConcreteFactory):生产具体的产品。
- 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法。
- 具体产品(ConcreteProduct):具体的产品类。
// 工厂方法模式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
//抽象产品类AbstractSportProduct
class AbstractSportProduct
{
public:
AbstractSportProduct() {}
virtual ~AbstractSportProduct() {}
//抽象方法
virtual void PrintName() = 0;
virtual void Play() = 0;
};
//具体产品类BasketBall
class BasketBall : public AbstractSportProduct
{
public:
BasketBall()
{
PrintName();
Play();
}
//具体实现方法
void PrintName() { cout << "Tom get basket ball!" << endl; }
void Play() { cout << "Tom play basket ball!" << endl; }
};
//具体产品类FootBall
class FootBall : public AbstractSportProduct
{
public:
FootBall()
{
PrintName();
Play();
}
//具体实现方法
void PrintName() { cout << "Tom get foot ball!" << endl; }
void Play() { cout << "Tom play foot ball!" << endl; }
};
//具体产品类VolleyBall
class VolleyBall : public AbstractSportProduct
{
public:
VolleyBall()
{
PrintName();
Play();
}
//具体实现方法
void PrintName() { cout << "Tom get volley ball!" << endl; }
void Play() { cout << "Tom play volley ball!" << endl; }
};
//定义抽象工厂类AbstractFactory
class AbstractFactory
{
public:
AbstractFactory() {}
virtual ~AbstractFactory() {}
virtual AbstractSportProduct* GetSportProduct() = 0;
};
//具体工厂类BasketBallFactory
class BasketBallFactory : public AbstractFactory
{
public:
BasketBallFactory() { cout << "Create basket ball factory!" << endl; }
AbstractSportProduct* GetSportProduct()
{
cout << "basket ball!" << endl;
return new BasketBall();
}
};
//具体工厂类FootBallFactory
class FootBallFactory : public AbstractFactory
{
public:
FootBallFactory() { cout << "Create foot ball factory!" << endl; }
AbstractSportProduct* GetSportProduct()
{
cout << "foot ball!" << endl;
return new FootBall();
}
};
//具体工厂类VolleyBallFactory
class VolleyBallFactory : public AbstractFactory
{
public:
VolleyBallFactory() { cout << "Create Volley_Ball_Factory!" << endl; }
AbstractSportProduct* GetSportProduct()
{
cout << "volley ball!" << endl;
return new VolleyBall();
}
};
int main()
{
cout << "工厂方法模式!" << endl;
//定义工厂类对象和产品类对象
AbstractFactory* Factory = NULL;
AbstractSportProduct* Product = NULL;
Factory = new BasketBallFactory();
Product = Factory->GetSportProduct();
Factory = new FootBallFactory();
Product = Factory->GetSportProduct();
Factory = new VolleyBallFactory();
Product = Factory->GetSportProduct();
delete Factory;
delete Product;
return 0;
}