设计模式是为了解决某种问题而进行的代码设计,通过许多工程师反复的使用,最后造成了一种模式,它不针对于特定的语言,隶属于公共技术分类。由于做者是Java程序员,因此在编码实现中都使用Java语言。程序员
设计模式一般包含如下几个部分。算法
首先是问题,它是为了解决什么问题而存在的。编程
其次为实际应用场景,如何解决特定场景下的问题,例如在单例模式时,存在多线程,多JVM等等的场景。设计模式
最后是实现方案,如何经过编程语言来编码实现。本文也经过这种结构来介绍设计模式,为了方便理解,在最后会研究一个优秀的示例,示例的取材来源于经常使用的框架,Java代码等等。数组
设计模式按照其功能,特色能够分为三类网络
建立型模式 数据结构
建立型模式主要的功能就是建立对象。它能够分为两种类型,一种为建立对象的实例(如下简称建立分类),另一种为复用现有对象的实例(如下简称复用分类)。它总共包含七种设计模式。多线程
- 单例模式:在特定的环境中,保证对象只存在单个实例。隶属于建立分类。
- 工厂模式:为了建立对象树,工厂模式返回的都是对象树的根类。根据对象树的复杂程度,应用不一样的工厂模式。当对象树下包含的种类数量较少时(一般能够枚举,例如扑克牌的花色,大小),使用简单工厂模式;当对象的种类比较多,而且拥有几种简单的分类时,而且每种类型下面又能够枚举时(例如手机,分为苹果,小米,华为,苹果下面又能够细分),可使用工厂方法模式;当对象的数量比较巨大时,使用抽象工厂模式。隶属于建立分类。
- 构建者模式:为了建立复杂对象,在建立对象中,须要分步进行时,可使用构建者模式。隶属于建立分类。
- 原型模式:经过已有对象的实例来建立新的实例对象,它的解决方案依赖于Cloneable接口,其余语言的实现方案能够自行研究。隶属于复用分类
- 对象池模式:为了复用已有对象的实例,而不用从新建立,它的应用很是普遍。隶属于复用分类。
结构型模式 架构
结构型模式主要的特色是,在它的解决方案中,在不修改原有代码的基础上,添加新的类来实现。按照功能将其分为三种,第一种为解耦,适配器模式。组合模式。第二种为了知足新的需求,添加新的功能,装饰器模式,添加新的功能实现方式,桥接模式。第三种为了提升性能,减小内存的使用,享元模式,减小耗时资源的使用,代理模式。它们的格式通常都比较固定。它总共有六种设计模式。框架
- 适配器模式:为了实现原有类型和现有类型的解耦。这里的类型能够为接口或者是类,总共分为4种场景,当原有类型为接口,现有类型为接口;当原有类型为接口,现有类型为类;当原有类型为类,现有类型为接口;当原有类型为类,现有类型为类,每一种场景对应特定的结构。它的实现方案为添加XXAdapter来实现。
- 组合模式:对于对象使用者而言,为了统一处理对象与它的集合类型。对象的集合类型自身维护添加,删除,替换对象等等功能,它的实现方案为集合类型与对象实现相同的接口,对于接口中关于集合类型的方法,对象抛出异常或提示不支持的操做。
- 桥接模式:对于特定的功能,为了提供一种实现方案,而且能够在这些实现方案中相互切换。为了知足这样的需求,须要将对象与功能的实现方式进行解耦。它的实现方案为将对象的功能委托给某个接口类,当须要新的实现方式时,经过添加新的接口实现类来实现。
- 装饰器模式:为了知足需求,须要在原有的接口提供新的功能,它与桥接模式很类似,桥接模式是在原有的功能上提供新的实现方式,装饰器模式是提供新的功能,例如排序,须要添加二分法排序,可使用桥接模式,添加一个二分法的接口实现类来知足需求。它的特色为原来的功能须要复用原来的实现,新的功能须要添加新的子类来实现。
- 享元模式:为了减小在建立对象时的内存消耗,将对象的公共属性封装在公共类型中,而私有属性封装在私有类型中,在建立对象时,经过建立私有对象,私有对象中引用公有对象,以此来达到共享公共属性的目的。经过减小公共属性占有的内存来减小内存的开销。
- 代理模式:代理模式的做用有两种,第一种为了提供性能,减小使用较大的资源,例如在网页在初始化的过程当中,一般加载一个URL连接,而当用户点击时,此时去加载比较大的网络资源,一般为图片,视频等等,此时的代理类至关于实际类型的快捷方式,它的实现方案为静态代理。第二种为了添加公共操做,例如校验权限,记录日志等等,当调用实际对象的方法时,实际调用的是代理对象的方法,代理对象方法能够由本身定义,可是都拥有原来的方法。此时代理类至关于黑客,在原有方法中添加了本身的方法,此时实际对象并不知道代理对象的存在。不管是哪一种情形,它的实现方案都是经过添加代理类。
行为型模式
它的主要特色是,它更贴近于生活,它的问题每每能够转换为实际的生活场景,它的解决方案中,各个对象每每对应生活中的各类角色。因此理解行为型模式时,模拟为生活场景会很是容易理解。它包含十一种设计模式。
- 职责链模式:处理请求,流程化的响应。能够理解为生活中的各类流程,例如医院挂号,公司报销流程。
- 命令模式:处理请求,响应。将请求方与实际的响应方进行解耦,将请求方的响应委托给第三者。例如生活中的点餐。快递员配送流程。
- 解释器模式:待补充
- 迭代器模式:为了遍历不一样的集合类型。集合的类型能够为数组,List,Set等等。它不依赖于具体的集合类型,而依赖链式的数据结构。
- 中介者模式:待补充。
- 备忘录模式:记录对象被修改的每一个状态。这个类比于实际开发中版本控制工具,记录文件被修改的每一个状态。
- 观察者模式:将对象状态的变化发送给对象的订阅者。例如生活中的报纸订阅,网购时商品价格下降时通知消费者,微博订阅等等。
- 策略模式:与桥接模式很类似,为了实现不一样的算法,而且能够在算法之间来回切换。例如生活中联系某我的,能够经过邮件,网络通信工具,电话方式来通知,当一种方式不可行时,须要有别的选择。
- 模板模式:将设计与实现进行解耦,模拟为生活中架构师设计了代码,让程序员去实现具体的功能。
- 访问者模式:为了调用相同方法,而却拥有不一样的对象类型,彼此之间没有继承的父子关系。能够理解为为了method不一样的object。其中method表示方法,通常抽象为visit方法,object为各类不一样的类型。例如对象的Comparable,迭代者模式能够说是一种特定的实现。
- 空对象模式:当实现一个功能时,能够有不一样的选择。能够创建一种选择的顺序,例如Log4j在加载配置文件时。