11.设计模式
11.1 GoF和Design Patterns
1994年,由4位大牛(GoF)合著出版了《Design Patterns: Elements of Reusable Object-Oriented Software》一书,中文翻译为《设计模式》。该书首次提出了软件开发中设计模式的概念,将设计模式规范化并提升到了理论高度。在书中提及了23种设计模式,这些模式可以分为3类:创建型模式、结构型模式、行为型模式。设计模式遵守的6大设计原则:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则。
单一职责原则:一个类只负责功能领域中的一个职责。即一个类不要承载太多的功能,职责尽可能单一。
开闭原则(开放封闭原则):封闭是指当一个设计好了,功能稳定后,若想增加新的功能,不要修改原来的代码;开发是指虽然类的代码不能修改,但是可以扩展,对原代码扩展来增加需要的功能。
里氏替换原则:派生类对象可以替换基类对象,即上行转换;但是基类对象不能替换派生类对象。
依赖倒置原则:上层调用下层,上层依赖下层,当下层产生变动时会影响上层,因此需要提供一个抽象类界面作为上下层之间的接口。
接口隔离原则:使用多个专门的接口,而不使用单一的总接口,类似于单一职责原则。
迪米特法则:若2个类无直接通信,则这2个类就不要发生直接的相互作用。避免当一个类发生改变时,会影响另一个类。
由于23种设计模式太多,本章主讲常用的13种设计模式。
11.2创建型模式
创建型模式:用于构建对象,以便它们可以从实现系统中分离出来。主要讲工厂模式(简单工厂、工厂方法、抽象工厂)和单例模式。
11.2.1工厂模式
工厂模式分为3种:简单工厂模式、工厂方法模式、抽象工厂模式。
//简单工厂模式
#include <iostream>
using namespace std;
enum PhoneType { honor,mate};
//华为手机
class Huawei
{
public:
virtual ~Huawei() {}
virtual void call(void) = 0;
};
//华为旗下的荣耀
class Honor :public Huawei
{
public:
virtual void call(void)
{
cout << "Honor Phone" << endl;
}
};
//华为旗下的Mate
class Mate :public Huawei
{
public:
virtual void call(void)
{
cout << "Mate Phone" << endl;
}
};
//华为手机的生产工厂
class Huawei_Factory
{
public:
Huawei * CreatePhone(PhoneType type)
{
switch (type)
{
case honor:
return new Honor;
case mate:
return new Mate;
default:
return NULL;
}
}
};
int main()
{
Huawei_Factory hf;
Huawei * ho = hf.CreatePhone(honor);
ho->call();
Huawei * ma = hf.CreatePhone(mate);
ma->call();
delete ho;
delete ma;
return 0;
}