1.创造模式
工厂方法模式:当客户端不知道要创建哪个具体类的实例,或者不想在客户端代码中指明要具体创建的实例时,用工厂方法。定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。
常规情况下,client直接创建具体对象:Product p = new ProductTwo();
在工厂方法模式下:Product p = new ConcreteTwo().makeObject();
抽象工厂模式:提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体类。
![](https://i-blog.csdnimg.cn/blog_migrate/358f3e7b3e0d4c5f66ed94152c16bb41.png)
抽象工厂创建的不是一个完整产品,而是“产品族”(遵循固定搭配规则的多类产品实例),得到的结果是:多个不同产品的Object,各产品的创建过程对客户端可见,但“搭配”不能改变。本质上,抽象工厂是把多类产品的工厂模式组合在一起。
工厂模式创建一个对象,而抽象工厂创建了多个对象。抽象工厂使用组合/委派,而工厂模式使用继承/子类型。
构造器模式:创建复杂对象,包含多个组成部分。
![](https://i-blog.csdnimg.cn/blog_migrate/fc4c3dd9d9c4c57949d300fa0af8ce7d.png)
构造器模式创建的是一个完整的产品,有多个组成部分,客户端不需要了解每个部分是怎样创建、组合的,最终得到一个产品的完整Object。
构造器模式与模板模式相比,模板模式是为了复用算法的公共结构,而构造器是为了创建“复杂对象”,灵活扩展。
2.构设计模式
桥接模式:通过委派和继承来建立两个具体类之间的关系。
![](https://i-blog.csdnimg.cn/blog_migrate/ced001fcfcc479b52ee4d952a88ca8ee.png)
桥接模式强调双方运行时的链接。一个类A的对象中有其他类B的对象作为其组成部分,但A的对象具体绑定到B的哪个具体子类的实现,在运行时通过委派加以组合,并永久保存这种委派关系。
策略模式强调一方在运行时使用另一方的算法。“算法”通常实现为“类的某个方法”的形式,策略的目的并非在“调用算法的类”与“被调用算法所在的类”之间建立永久的联系,而只是帮助前者临时使用后者的算法。
代理模式:某个对象比较“私密”、“宝贵”,不希望被客户端直接访问,故采用代理模式,在二者之间建立防火墙。
![](https://i-blog.csdnimg.cn/blog_migrate/8b1288d5090cff72e3409fae12c9236b.png)
适配器模式是为了消除不兼容,目的是B以客户端期望的统一方式与A建立起联系。代理模式是隔离对复杂对象的访问,减低代价,定位在“访问”。
组合模式目的是在同类型的对象间建立属性结构,一个上层对象可包含多个下层对象。
装饰模式强调同类型对象间“特征增加”的问题,它们之间是平等的,区别在于“特征”的数量,每次装饰只能作用于一个Object。
3.行为设计模式
观察模式:就像粉丝到偶像那里注册,偶像一旦有新闻发生,便推送给自己的粉丝。
![](https://i-blog.csdnimg.cn/blog_migrate/dba20a633aa5b8c17517a90ce2814e53.png)
访问模式:对特定类型的Object的特定操作,在运行时将二者动态绑定在一起,该操作可以灵活更改,无需更改被访问的类。本质上是将数据和作用于数据上的某些特定操作分离开来。
![](https://i-blog.csdnimg.cn/blog_migrate/62230a98ce9eb14cfc7d39110a4ac5c7.png)
迭代器以遍历的方式访问集合数据而无需暴露其内部表示,即将遍历这些功能委派的代外部的迭代器对象。
访问模式在特定ADT上执行某种特定操作,但该操作不在ADT内部实现,而是委派给访问对象,客户端可以灵活扩展访问的算法操作而不影响ADT。
Mediator模式:多个对象间要进行交互,不是直接交互,而是通过mediator,实现消息的广播,从而将对象之间松散耦合,利于变化。
![](https://i-blog.csdnimg.cn/blog_migrate/03d8a0dc92c432bf5785f5c7287407d8.png)
Mediator与Observer相比,Observe自己来广播,其他对象接受;而Mediator第三方中介复杂广播。
Command模式:将“指令”封装成对象,指令的所有细节对客户端隐藏,在指令内对具体的ADT发出动作。客户端希望执行指令,但不想知道指令的细节,也不想知道指令的具体作用对象。
![](https://i-blog.csdnimg.cn/blog_migrate/47c9ac2535e815f9129d11e5a3080957.png)
Command模式将所有对客户端提供的指令与内部执行的ADT彻底分开,指令对外看了是“黑盒”。
职责链模式(Chain of responsibility):避免在请求方和各解决方之间的紧耦合,于是构造流水线,请求在其上传递,直到被处理为止。客户端只需在流水线的入口发出请求即可,请求自动在流水线上传递,直到被处理。
![](https://i-blog.csdnimg.cn/blog_migrate/717616a80686fc27248005831daf4171.png)