c++设计模式为什么要学 (设计模式工厂模式)

设计模式原则

  1. 开闭原则(Open Close Principle):对扩展开放,对修改关闭。在程序扩展的时候,不能修改原有的代码。客户的需求是不稳定的,通过扩展已有的软件系统而不是通过修改软件系统来满足客户需求;这样软件系统具有一定的灵活性和适应性。
  2. 里氏代换原则(Liskov Substitution Principle):任何基类可以出现的地方,派生类一定可以出现。LS原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类和派生类的继承关系就是抽象化的具体实现,因此LS原则是对实现抽象化的具体步骤的规范。
  3. 依赖倒转原则(Dependence Inversion Principle):针对接口编程,依赖于抽象而不依赖于具体。该原则是开闭原则的基础。
  4. 接口隔离原则(Interface Segregation Principle):使用多个隔离的接口,比使用单个接口要好;这种方式可以降低类之间的耦合度。设计模式是从大型软件架构出发,便于升级和维护的软件设计思想,要做到降低依赖,降低耦合。
  5. 迪米特法则(Demeter Principle):又称最小知道法则,意思是一个实体应当尽量少的与其他实体之间相互作用,使得系统功能模块相对独立。
  6. 合成复用原则(Composite Reuse Principle):尽量使用合成/聚合的方式,而不是使用继承。

简单工厂模式

简单工厂模式是由工厂对象决定创建出哪种产品的实例。举个例子,如图所示,一个体育用品生产厂可以根据客户的需求生产篮球、足球和排球。球类是一个抽象的产品,相当于基类;而篮球、足球和排球是具体的产品,相当于派生类。客户告诉工厂自己的需求得到对应的产品,并不需要关系产品的生产细节。

C++设计模式,c++设计模式详解

从例子中可以看出,简单工厂模式具有3个元素:

  • 抽象产品(AbstractProduct):具体的产品类的基类,提供抽象接口。
  • 具体产品(ConcreteProduct):抽象产品的派生类,包括具体产品的实现方法。
  • 生产工厂(ProductFactory):根据客户提供的产品参数,生产具体产品实例。

简单工厂模式UML类图如下:

C++设计模式,c++设计模式详解

// 简单工厂模式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
typedef enum
{
  BASKET_BALL = 0,
  FOOT_BALL,
  VOLLEY_BALL
}SPORT_TYPE;

//抽象产品类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; }
};

class SportFactory
{
public:
  static AbstractSportProduct* GetSportProduct(SPORT_TYPE Sport)
  {
    AbstractSportProduct* pSport = NULL;
    switch (Sport)
    {
    case BASKET_BALL:
      pSport = new BasketBall();
      break;
    case FOOT_BALL:
      pSport = new FootBall();
      break;
    case VOLLEY_BALL:
      pSport = new VolleyBall();
      break;
    default:
      break;
    }

    return pSport;
  }
};

int main()
{
  cout << "简单工厂模式" << endl;
  AbstractSportProduct* Product = NULL;
  Product = SportFactory::GetSportProduct(BASKET_BALL);
  Product = SportFactory::GetSportProduct(FOOT_BALL);
  Product = SportFactory::GetSportProduct(VOLLEY_BALL);
  return 0;
}