序言
从最开始买了本《设计模式》吃灰,到自己做了一些软件开发后,又看了一些设计模式的资料,总结一下自己对各种设计模式的理解
创建型模式
1. 单例模式
如果软件运行过程中只存在唯一
的实例,就可以使用,访问会很方便
,只要inlcude头文件之后,然后调用Class::GetInstance()进行访问即可。
2. 工厂模式
包含三种子模式,
- 工厂方法,这个模式就是通过传入一个区分类类型的字符串给工厂,工厂创建对应的类,代码体现就是从new一个类,变为了通过工厂和传入标识创建类。
- 简单工厂,这个需要为每一种类创建相应的工厂,可以结合工厂方法一起使用。
- 抽象工厂,创建一系列类使用,
基本用不到
3. 原型模式
主要在于实现一个clone函数,通过clone来创建对象,从拷贝构造函数生成对象,而不是构造函数
,用于构造函数很复杂的类,和需要创建多个对象时使用。
4. 建造者模式
这个顾名思义,最开始看《设计模式》也是这个,讲了一个搭建迷宫的例子,主要用于搭建式的创建,感觉也用不到
。
结构型模式
1. 桥接模式 https://zhuanlan.zhihu.com/p/703288601
就是一个抽象类,内部组合了另外的抽象类
,抽象形状类的内部组合了抽象颜色类,然后进行多种组合即可。
2. 适配器模式
参考语言本身的适配器模式即可,比如C++的queue和stack内部都是由deque进行的适配,虽然这个不涉及面向对象,但所表现的含义一致,核心观点是适配
。
3. 装饰者模式
主要是为了个一个类做一些额外的功能,通过组合的方式,而不是子类化的添加,核心观点是装饰
。
4. 代理者模式
通过一个代理类来访问内部的实现类,内部实现类对于外部不可访问,核心观点是代理访问
。
5. 外观模式
用于为多个子系统提供统一访问的抽象接口,用户只需要通过具体外观类控制接口,不需要了解各个子系统实现,核心观点是简化复杂系统的交互性
。
6. 享元模式
通过共享方式减少内存开销,但需要多出数据结构维护共享的数据,内存池就是其一种其思想体现,核心观点是共享资源
。
7. 组合模式 https://blog.csdn.net/jun778895/article/details/141526587
强调部分-整体
的层次结构,json的设计是其一种体现。object是容器节点,其他类型是叶子节点,目前涉及不到,仅了解应用场景
。
行为型模式
1. 策略模式
就是多态
2. 观察者模式
被观察者维护观察者列表和状态,当被观察者内部状态发生变化时通知观察者
3. 中介者模式
降低耦合
,负责封装一组对象之间的交互,如一个模块存在一个管理者负责与所有相关类进行通信
4. 状态模式
状态机,对象在不同状态下表现出不同的行为
5. 命令模式
将请求封装为一个具体的对象
,并提供对请求执行、撤销和重做的支持
6. 模板方法模式
继承和多态的共同体现
,子类可以复用基类共同代码,同时实现自定义行为。
7. 迭代器模式
STL迭代器
是其体现,提供间接方式访问容器,不需要知道容器的具体实现方式,其用意搜索如下,来自百度AI
- 访问和操作容器的统一接口
- 容器与算法的分离
- 灵活性
- 避免直接暴露容器内部实现
- 弥补语言不足
8. 访问者模式 https://blog.csdn.net/GOLOJO/article/details/139620699
允许在不修改类行为的前提下,定义作用于这个类上的新的操作,注意是直接在这个类上进行操作(调用)
。
根据实现来看,是可以通过组合的方式直接调用其提供的公有函数,也能实现不同的访问方式,但这种操作是在一个新的类上进行。
9. 解释器模式 https://blog.csdn.net/K1_uestc/article/details/135860748
定义了⼀个语⾔的⽂法,并且建⽴⼀个【解释器】来解释该语⾔中的句子,如编程语言、SQL语句、正则表达式,目前涉及不到,仅了解应用场景
。
10. 责任链模式 https://blog.csdn.net/L_qingting/article/details/140044903
多个对象可以处理同一个请求,一个请求往责任链
发送,不确定具体由谁进行处理时使用
11. 备忘录模式 https://blog.csdn.net/qq_68194402/article/details/141690946
用于恢复过往状态
,对象包含保存当前状态和恢复过去状态的方法,过往状态由管理者保存。