理解设计模式有两种途径,一种是看UML类图,一种是看代码理解实例,UML(一个简单的介绍)看懂了对理解设计模式大有裨益,代码容易陷进去,因此最好能找到适当且易于理解的应用场景,这下面实际上每个都是我收集的觉得讲得比较好的网址,整理一下,供自己,也供他人参考。
1.单例模式
参考:C++ Singleton (单例) 模式最优实现 多线程控制
单例模式有几大常见要点:
- 类内部有一个无参构造函数,且为私有
- 类提供一个接口供外部使用,接口保证只有一个类的实例
- 类的赋值构造函数,拷贝构造函数最好显式的设置为私有,以防破坏单例性质
- 为防止内存泄露,比较土的办法是专门声明一个函数来清理内存,一个较好的方式是声明静态的类实例,让其自动销毁。(这点与java声明内部类不同)
- 有些版本还加上了多线程控制,虽然效率降低,但是更安全
- C++版本有两种,一种是接口返回引用,一种是接口返回指针,返回引用比较符合用户预期,因为返回指针会造成用户怀疑是否需要自己检查指针有效性然后自己调用delete(虽然通过将析构函数私有可以保证调用的时候编译出错,但是不要误导用户为好)。
- 如果加入多线程控制,那么可以定义一个locker类
- 为了防止内存泄露,最好设计一个内部类。让其析构的时候自动清除内存。
2.简单工厂模式、工厂模式、抽象工厂模式
常说的工厂模式有简单工厂模式,工厂模式,抽象工厂模式
有工厂,对应就有产品,工厂模式的初衷是产品不自己制造自己,而统一由工厂模式来构造。这样有两个好处:
- 接口与实现分离,用户不用考虑类是怎么实现的,有的类实现起来很简单,有的实现起来可能比较复杂,但是用工厂模式,类实现的改动对用户是透明的
- 清晰:工厂通常制造某一类的东西,用工厂函数来制造东西使用户对程序用途的理解更深
简单工厂模式说白了就是用户给参数告诉工厂声明什么样的产品
工厂模式是一类产品对应一个工厂,一般这个工厂只有一个工厂函数
抽象工厂模式就是将类的概念泛话,比如单核A处理器和多核A处理器可能会被认为是一类,而在工厂模式中可能不会认为是一类,因此在抽象工厂模式中可能会有更多的工厂函数。
3.桥接模式
桥接模式可以减少代码耦合,减少代码量,将继承层数减少,用组合来代替。
第一个参考链接里面的UML图很形象,第二个C++实现里面讲桥接的文字描述写得很透彻。
4.适配器模式
适配器顾名思义,是转换接口用的。具体实现是将要适配的物体组合到一个类中,这个类继承了我们要获得的接口。
5.建造者模式
参考:意义理解
建造者模式这么理解,对于某物的构建,可以分部分进行,每个部门建造起来可能随着方法不同变化剧烈,但是他们组合的方法去相对稳定,那么这就比较适合建造者模式了。
目前对设计模式的理解还不足以让我记得很牢,主要原因是没有实际应用的经验,所以先总结这几个比较常见的设计模式吧,另外需要对设计模式的总体有个把关,因此有了第六条。
6.设计模式概览