c++设计模式教程 (C++设计模式和实例)

工厂方法模式

在简单工厂模式中,每次增加一个具体产品,都需要修改工厂的判断代码。工厂方法模式不采用一个工厂生产具体产品,而是针对不同的产品设计不同的工厂,每个工厂只生产特定的产品。这种方式遵循开闭原则。

举个例子,如图所示,客户想选择打篮球、足球和排球,这时他只需要到篮球室、足球室和排球室拿到相应的球,并不需要关心篮球、足球和排球是如何产生的。

c++设计模式教程,c++设计模式详解

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

c++设计模式教程,c++设计模式详解

从上面可以看出,工厂方法模式需要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;
}