网上查到的设计模式有23种,通过归纳去认识他们也是一种不错的视角。
我这边不按照主流的观点去划分为创建型、结构型、行为型三大类
其实程序设计模式里,大多数的考虑初衷都是为了面向未来未知情况,在当前就先规划做好扩展方式,方便能让未来使用者使用方便的代码结构。
也有能节省资源的设计模式、方便解耦的设计模式...
设计模式的相似性、复杂性:
不得不承认有几个设计模式其实很相似,但他们之间的差异只是名字上的区别,
设计模式只能是参考,一定不是必须要遵守的教条,这样会很容易让一个事物搞得越来越复杂!
创建型
帮助机器(系统)节省资源的创建对象模式:
- Singleton Pattern
在程序的整个生命周期里,有且只有一个实体类; - Flyweight Pattern
通过在类里面设置状态,来操作类。 注意:尽管享元模式可以通过内部状态
和外部状态
的设置来控制类的行为,但其核心目的并不是通过状态的设置来控制类,而是通过共享对象和分离状态来提高内存利用和性能。 - Prototype Pattern(也叫克隆模式)
对一个类进行大量的克隆,节省资源;
面对未来未知,由外部提供需求来创建对象模式,如下几种应该说在各大框架里能常看到:
- Simple Factory
- Factory Methoed Pattern
- Abstract Factory Pattern
当抽象工厂模式只生产一个产品时,和工厂方法模式没啥区别。当它生成一组或多个产品时,才有所区别。 - Buidler Pattern
建筑工程最能体现这个模式了,首先盖房流程很多,并且不同公司会有不同方案,最终生产时需要一个监理进行宏观管控。
结构型
- Facade Pattern(也叫前台接待模式)
你去一个公司面试,你只能通过前台(调用前台),找面试人、打水、打印简历等操作。好处是,你不需要你自己进办公楼里到处找面试人,自己到处找打印机去打印简历。 - Template Pattern
模版模式也是一种应对未来未知情况的解决方案,部分可知,部分不可知; - 观察者模式
一种一对多的关系,当一个类的状态发送改变,就通知所有依赖(有关系)的类; - 状态模式/策略模式
将状态封装成一个类,不同状态的类,会有不同的行为。 状态模式和策略模式是一样的。 - 中介者模式
为了解耦各个类,只通过中介者去通信,有点绕。 - Proxy Pattern
- 代理对象充当了客户端和目标对象之间的中介,从而可以在访问目标对象时添加额外的逻辑;
- 代理对象持有一个真实主题的引用,并在需要时创建或获取真实主题对象;
- 代理对象在调用真实主题之前或之后,执行一些额外的操作,例如权限验证、缓存、日志记录等。
- 责任链模式
责任链模式很容易理解(想想在公司请假的流程,员工发起,组长审批——>部门领导审批——>HR审批——>BOSS...)
它也用到递归,控制不好就容易死循环;
下面这些个模式一般不在程序设计的时候考虑,并且新程序在设计初期就不应该出现如下情况,会把程序搞复杂!反而,它们更适合运用在程序维护阶段,程序已经运行起来,在不大规模的重构之前,也没有好办法的时候才考虑使用。当然还有一种情况,就是你使用别人写好的接口,调用别人的SDK,你是无法修改调用的接口方法的,你能做的就是自己封装多一层中间层,下面是几种不同场景介绍:
- Adapter Pattern(适配器模式)
当需要使用一个已存在的类,但其接口与要求的接口不匹配时。 - Decorator Pattern(装饰者模式)
- 用于在不修改现有对象结构的前提下,动态地给对象添加额外的功能;
- Decorator 和 Proxy有相似的地方,就是都是给现有类.方法增加额外功能,不同点在于Decorator是不修改现有对象结构。
行为型
- Composite Pattern
需要用到递归,控制不好就容易死循环; - Bridge Pattern
- 迭代器模式
解耦思想,将行为和对象分离; - 备忘录模式
在不暴露对象内部状态的情况下保存和恢复对象的状态。
为了完成这个保护和恢复功能涉及的类比较多,就容易复杂。 - 命令模式
也是一种解构思想,将行为和数据结构分离;
命令模式还有一个撤销操作,和备忘录有相似; - 访问者模式(主体不变却可以自由加入行为模式)
在不修改现有对象结构的情况下,定义对对象结构中各元素的新操作 - 解释器模式
一个简单版的编译器、解释器