文章目录
本系列文章共分为五篇:
设计模式的分类与原则
创建型模式
结构型模式
行为型模式
设计模式的区别
在之前的文章中,简单总结了一下各种设计模式。此时,有必要从总体上去对比、总结一下,这样能更好地理解与掌握。
一、设计模式的适用场景
这个章节,对23种设计模式的不同点做了一些简单总结,以便更直观地从全面把握,具体如下:
模式 | 适用场景 | 例子 |
---|---|---|
单例模式 | 只要求生成一个对象 需要频繁实例化,而创建的对象又频繁被销毁 |
线程池 Android应用中的全局Context |
工厂方法模式 | 父工厂类中只有创建产品的抽象接口,将产品对象的实际创建工作推迟到具体子工厂类当中 | 老师布置作业,要学生制作一个机甲玩具,小明做了奥特曼,小李做了变形金刚 |
抽象工厂模式 | 系统中有多个产品类,但每次只使用其中的某一类产品 | 依旧以老师布置作业为例,老师除了布置机甲作业外,还可能布置书法练习作业,小明写了楷书,小李写了行书 |
建造者模式 | 对象可以分模块初始化 | Android中的AlertDialog |
原型模式 | 不同对象之间相似度搞 创建对象比较麻烦,但复制比较简单 |
clone |
适配器模式 | 不同模块之间接口不一致 | 插口转换器 |
桥接模式 | 不同类都有多个变化的维度,这些维度可以组合成不同的结果 | 如颜色(有黑色、灰色)与书包(有双肩包、挎包),可以组合成四种不同的包 |
组合模式 | 表示一个对象整体与部分的层次结构 | 文件夹与文件 |
装饰器模式 | 不影响原有模块功能,需要动态地添加、撤销一些附属功能 | 在原有模块中加入日志打印 |
外观模式 | 隐藏子系统的复杂操作,对外提供简单的接口 | 找代购者买商品,代购者会进行货物挑选、议价、买入等流程 |
享元模式 | 系统中存在大量相同或相似的对象,只保存一个就行 | 围棋中的黑白子 |
代理模式 | 控制访问权限 | 不同管理层可以看到公司不同程度的财务账目 |
模板模式 | 子类执行固定步骤下的不同具体步骤 | 优酷和爱奇艺都决定在6月推出悬疑剧集,爱奇艺推出了《十日游戏》,优酷推出了《失踪人口》 |
策略模式 | 不同算法互相替代使用 | 要进行排序时,可以使用快速排序,也可以使用插入排序 |
状态模式 | 状态在很大程度上决定了系统的运行 | 开关 |
观察者模式 | 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象 | 群发邮件 |
备忘录模式 | 需要保存与恢复数据的场景 | Ctrl + Z |
中介者模式 | 不同对象之间关系复杂,需要调整 | 买房者、卖房者与中介 |
迭代器模式 | 为遍历某种结构提供统一接口 | 遍历器Iterator |
解释器模式 | 语言的文法较为简单,格式固定 | XML、JSON解析 |
命令模式 | 请求调用者与请求接收者解耦 | 物理老师给物理课代表下了一个命令:找出办理物理成绩最好的人 |
责任链模式 | 有多个对象可以处理一个请求 | 不同级别的人可以批准不同时长的假期 |
访问者模式 | 对象结构中的对象需要提供多种不同且不相关的操作,而且要避免让这些操作的变化影响对象的结构 | 浏览不同的电商网站购买衣服 |
二、设计模式的区别
2.1 状态模式与策略模式
状态模式处理对象所处的状态,封装了依赖于状态的行为;策略模式处理对象如何执行特定的任务,它封装的是算法。
2.2 策略模式与模板方法模式
在模板方法中,算法是在编译时通过继承选择的。使用策略模式,算法在运行时通过组合选择。
2.3 代理模式与装饰模式
代理模式控制对象访问权限,装饰模式用于向对象添加职责。
2.4 工厂模式与创建者模式
创建者模式可以将零件对象组装成整体,而工厂模式直接给出完整的对象。
2.5 访问者模式与迭代器模式
访问者模式一般遍历复杂结构,如树结构或组合结构等,结构中每个结点可以同构也可以异构,前提是只要提供一个预定的统一访问接口即可。迭代器模式用于遍历元素类型一致的集合(多是线性结构,当然也可以是非线性结构),不用为每个元素定义统一的访问接口。
2.6 适配器模式与外观模式
适配器模式一般只包装一个对象,目标是为了改变接口来适应外部系统,但要完成的功能没变。外观模式 一般是将一个子系统进行包装,目的是简化接口。
2.7 装饰器模式与适配器模式
装饰器模式是为了给现有对象增加功能,一般接口不变或接口增加。适配器模式是为了改变其接口,功能保持不变。
2.8 工厂模式与原型模式
工厂模式是重新实例一个对象,原型模式是从已有的实例直接拷贝生成一个实例,从而省去了初始化的过程。
2.9 备忘录模式与命令模式
两种模式都可以提供回到先前某点的功能,但前者是针对对象状态,后者针对对象行为。
参考资料:那些相似的设计模式的区别