创建型模式
1、工厂模式
-
简单工厂
可以是静态的,也可以是非静态的,一般都是静态的,做法是把对象的创建过程抽离出来封装出一个静态方法供外界调用。
-
工厂方法
工厂方法是对简单工厂的升级,这时产品是一个接口的实现,因而有多种产品,所以工厂也有多个,与之一一对应生产,工厂也往往会抽象出一个接口,这时的子类工厂一般都做成单例。
-
2、抽象工厂
抽象工厂是“工厂方法”的进一步升级,每个工厂生产一组产品,或者说一个产品的一组组件,形式上工厂方法是抽象工厂的只有单一产品的特例。
总结:需要工厂方法都是因为产品的生产过程比较复杂,不能直接new(),或者易变,因而抽离,方便后续维护。
3、单例模式
没必要存在多个实例,或者存在多个实例会消耗大量资源,就会想法做成单例。既然是单例,必须保证线程安全。
4、建造者模式
与抽象工厂类似,多了个指挥者/调用者,通过指挥者建造实例。
5、原型模式
通过一个原型可以克隆一个新的实例,一般用深复制实现(序列化和反序列化)。
结构型模式
6、适配器模式
-
类的适配器
通过继承类、实现目标接口实现。
-
对象的适配器
通过持有对象、实现目标接口实现。
-
接口的适配器
通过一个抽象类屏蔽不需要的接口实现。
7、代理模式
与适配器结构类似,都是wrapper,代理类实现与被代理类同一接口(cgblib下为其子类),适配器模式适配成另一个接口。两者的目的和出发点不同,一个是为了适配,一个是为了“增强”,代理模式下,原接口可能是合适的,是为了在原逻辑前后做些事情使用了代理,参考AOP。
8、装饰模式
跟代理模式有点像,结构有所拓展,装饰者会有个接口,一般会有多个实现,目的是为了灵活切换装饰者,参考“换肤”功能。
9、外观模式/门面模式
一个不太像模式的模式,他的思想就是封装,对外提供一个较小的接口,隐藏所有的实现细节。
10、桥接模式
桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。
11、组合模式/合成模式
将有整体-部分的结构的每个组件统一结构化,典型的代表就是处理“树”。树中每个节点都是“一样的”Node,他们通过父节点、子节点构成层级结构,由于他们是同一类型,能大大简化实现逻辑,同时有着无限的拓展能力。
12、享元模式
是池化的思想,将各个无状态的bean用容器(比如map)存放,需要时取出,不用时放回,各个线程共享这些bean。
行为型模式
第一类 父与子
13、策略模式
将一个计算抽象成策略,通过使用策略完成计算,能避免在业务代码做繁杂的计算。策略模式的目的还是封装变化,或者切换策略。虽然能避免在业务代码写过多的if else,但是在策略里,或者选择策略时还是会有if else。参考商城过节打折,节后变回原价的销售策略。
14、模板方法
封装不变,开放变化给实现者。做法是一个抽象类,有个门面方法,门面方法调用几个其他方法。不想被子类修改的定义为final,需要子类实现的为抽象方法。行为由父类控制,子类实现某个细节。
第二类 两个类之间
15、观察者模式
就是常说的订阅-发布模式。
16、迭代模式
java.util下的集合类都是可迭代的,由于有这些强大的工具类,我们很少自己去构造新的可迭代的数据结构。
17、责任链
参考servlet中的Filter,各个过滤器构成了一个过滤器链。
18、命令模式
对象是属性和行为的集合,行为就是可执行的动作,他可以对应一个命令。
反过来,如果命令是一个标准,那么它的重要性就会扩大,占据命令接受者的风光。HTML的doc标准,它规定了一个按钮必须拥有哪些行为,比如点击。由于点击时处理细节是无法知道的,由于就有了“事件”一说,事件是对点击动作来说的,事件就是命令,而命令的接收者就是我们绑定在事件上的function。所以我们有理由相信,点击按钮时浏览器应该在内部触发执行了一个function,这个function通过一个钩子执行我们的绑定的function,如果我们不绑定,就不执行,这就是解耦。所以对于一个网页来说,浏览器很重要,它只知道是浏览器帮它完成了一切。
我们看到命令需要持有一个接收者,他是接收者的代理,他是个“站桩”。举个例子,老板、包工头、工人,老板要求包工头做哪些事情,包工头一律答应下来。包工头并不干活,工人干活。老板不不关心哪些活由哪个工人干,他也不会直接命令工人,他只命令包工头。所以包工头对老板很重要,工人不重要,工人离职了,包工头还可以换人干活。但反过来,工人需要有活干,它也不关系老板是谁,只要有人找包工头就行。
第三类 类的状态
19、备忘录模式
备忘录模式是备份的思想,将类当前的状态、信息备份起来,必要时恢复,不拘泥一个固定的结构。
20、状态模式
状态模式看起来简单,实际运用起来不简单,最典型的应用就是状态机。
第四类 通过中间类
21、访问者模式
将属性和行为分离,是一种回调思路。当不确定调用者如何利用自己时,构造一个接收访问的者方法accept,然后调用访问者的访问方法visit,将自己this作为参数传递过去。
参考景区,景区的大门不断accept游客visitor,游客一旦进来,景区就把自己交给了游客,游客想访问哪些具体的景点自己决定。
但如果景区以套票的形式,规定买什么样的票能访问哪些景点就成了普通的对象,拥有属性和特定的方法(服务)。
22、中介者模式
解耦需要沟通的各方,中介者就是消息中转站,vue的消息总线就是这个思路。
23、解释器模式
解释器模式不太好解释,构造自定义的语法,然后给出一个语句,能够解释它。各类编译器,语法解释器就是这种思路。由于比较底层,我们一般很少用到,一旦用到的项目都是高大上的项目。
参考 https://www.jianshu.com/p/c138a1d2be5e
参考