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

从例子中可以看出,简单工厂模式具有3个元素:
- 抽象产品(AbstractProduct):具体的产品类的基类,提供抽象接口。
- 具体产品(ConcreteProduct):抽象产品的派生类,包括具体产品的实现方法。
- 生产工厂(ProductFactory):根据客户提供的产品参数,生产具体产品实例。
简单工厂模式UML类图如下:

// 简单工厂模式.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;
}