设计模式主要有3类,23种。
本文总结了选择设计模式时主要的参考点。
具体的设计模式内容参考:1、C++设计模式系列文章汇总。
2、软件设计模式概述
创建型设计模式(Creational Patterns)
- 创建者模式(Builder):
对象的构造复杂,需要接受很多参数,这种情况可以考虑使用创建者模式。将复杂的对象构建过程,拆分成多个步骤,逐步构建。 - 工厂模式(Factory):
需要根据不同的传参,生成不同的对象时使用。常用的设计模式。 - 原型模式(Prototype):
3.1 对象的构造复杂,新构造对象时可以考虑使用原型模式,直接拷贝已有的对象。
3.2 重新构造对象代价很大时 - 单例模式(Singleton):
整个应用只要求唯一一个实例时,如:Windows任务管理器。常用的设计模式。
结构型设计模式(Structural Patterns)
- 适配器模式(Adapter):
已有的类能够实现新的软件需求,只是接口不一致时,可以使用适配器模式来适配接口。 - 桥接模式(Bridge):
接口类与实现类分离,这样接口类和实现类可以更加灵活的改动,而且相互独立。 - 组合模式(Composite):
树形结构的可以使用组合模式实现。 - 装饰模式(Decorator):
想要动态的扩展类的功能,可以考虑用装饰模式。 - 外观模式(Facade):
为子系统中的一组接口提供一个统一的入口。使得这一子系统更加容易使用。常用设计模式。 - 亨元模式(Flyweight):
大量的相似对象,这些对象的大多数属性又是相同的。可以使用亨元模式来减少内存的使用。 - 代理模式(Proxy):
为一个复杂的对象提供简单的代理类,让代理类来完成和实现一些操作。常用设计模式。
7.1 当客户端对象需要访问远程主机中的对象——可以使用远程代理;
7.2 当需要用一个资源消耗较少的对象来代表一个资源消耗较多的对象——虚拟代理;
7.3 当需要限制不同用户对一个对象的访问权限——保护代理;
7.4 当需要为一个频繁访问的操作结果提供临时存储空间——缓冲代理;
7.5 当需要为一个对象的访问提供一些额外的操作——智能引用代理。
行为型设计模式(Behavioral Patterns)
- 责任链模式(Chain of Responsibility):
处理某个请求的对象不止一个,对象处理请求的权限等不一致,请求可以沿着某一条对象之间形成的关系一级一级由下家传递到上家。 - 命令模式(Command):
将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。 - 解释器模式(Interpreter):
当需要开发一个新的语言时,可以使用解释器模式。 - 迭代器模式(Iterator):
提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露该对象的内部表示。 - 中介者模式(Mediator):
定义一个对象来封装一系列对象的交互。 - 备忘录模式(Memento):
需要对某个对象进行保存,恢复,撤销时,可以使用备忘录模式。典型的应用是文本中的撤销和重做功能。 - 观察者模式(Observer):
定义对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其依赖的对象都得到通知并被自动更新。 - 状态模式(State):
对象存在大量状态时,可以考虑使用状态模式。将状态从对象中分离出来,封装到专门的状态类中。
重点:状态的改变由状态类调用对象的设置状态函数来完成,对象自身不直接设置状态
参考:状态模式(详解版) - 策略模式(Strategy):
策略模式用于算法的自由切换和扩展。对于解决某一问题的算法族,允许用户从该算法族中任意选择一个算法解决问题,同时还可以方便地更换算法或者增加新的算法。 - 模板方法模式(Template Method):
定义一个操作中的算法框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。常用的设计模式。 - 访问者模式(Visitor):
访问者模式的结构相对较复杂,在实际应用中使用频率较低。如果系统中存在一个复杂的对象结构(含有多个组件),且不同的访问者对其具有不同的操作,那么可以考虑使用访问者模式。 - 模型-视图-控制器模型(MVC):
图形交互类程序常用。