5加7,11
创建型:5;结构型:7;行为型:11
创建型:单抽工建原
- 单例模式:
保证一个类只有一个实例(私有化构造方法),并提供一个访问它的全局访问点(提供静态getInstance方法,实例用volatile修饰,防止指令重排),双重校验+锁(双检锁)的写法如下:
java
public class Singleton6 {
private static volatile Singleton6 instance;
private Singleton6() {}
public static Singleton6 getInstance() {
if (instance == null) {
synchronized (Singleton6.class) {
if (instance == null) {
instance = new Singleton6();
}
}
}
return instance;
}
}
- 抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类
- 工厂方法:工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类
- 建造者:主要记住4个角色:产品,抽象建造者(抽象类,拥有具体产品),具体建造者(具体类,继承抽象建造者,返回具体产品),指挥者(拥有建造者,调用建造者创建产品):
- 原型:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象
结构型:桥代理组装适配器,享元回家装饰外观
有个姓桥的代理组装适配器,他儿子享元拿回家装饰外观去啦
- 桥接模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。一开始是接口和实现类,现在要在实现类中加一些功能,在不修改实现类的情况下,可以定义一个抽象类来充当桥,抽象类中拥有接口的引用,在想在接口实现类中加业务时,直接找具体的"桥",在具体的桥中加业务:
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制;在代理模式中,目标类对于客户端是透明的,由代理类隐藏其具体信息并响应客户端请求;而装饰者中客户端对特定的目标类对象进行增强;代理类与真实对象的关系常在编译时就确定了,而装饰者在运行时递归构造。
- 组合模式:它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系。组合模式一句树形结构来组合对象,用来表示部分以及整体层次。组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理各个对象以及组合对象。
- 适配器:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。用一个接口和实现类(适配器)充当转换,适配器实现类拥有原实现类引用,并转换成接口输出:
- 享元:旨在通过共享对象来最大化内存利用和性能提升,享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。当系统中存在大量相似对象时,每个对象都需要占用一定的内存空间,如果这些对象的大部分属性是相同的,那么频繁创建这些对象会导致内存消耗过大。享元模式将这些相同部分抽取出来作为共享的内部状态,在需要时进行共享,从而减少内存占用。需要有一下几个角色:抽象享元:抽象类;具体享元:抽象类实现;享元工厂,内部维护一个map存放共享的享元。
- 装饰者:动态的将新功能附加到对象上。内部其实就是不断的递归调用。
具体角色:
抽象组件(Component) :定义装饰方法的规范
被装饰者(ConcreteComponent) :Component的具体实现,也就是我们要装饰的具体对象。
装饰者组件(Decorator) :持有组件(Component)对象的实例引用,该类的职责就是为了装饰具体组件对象,定义的规范。
具体装饰(ConcreteDecorator) :负责给构件对象装饰附加的功能
1.装饰者和被装饰者有相同的超类(Component)。
2.你可以用一个或多个具体装饰(ConcreteDecorator)包装一个对象。
3.装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。(类似代理模式)
4.对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。
- 外观:为子系统中的一组接口提供一致的界面,facade提供了一高层接口,这个接口使得子系统更容易使用。
行为型:访问者写好策略备忘录,观察模板迭代的状态,命令中介解释责任链
这句话讲的就是看房子的经过。看房子的人就是访问者,看房前要写看房策略和备忘录,不能马马虎虎地去看房子。去看房子的时候,要仔细观察楼板(模板)层叠(迭代)的状态。
看完房子,命令中介解释清楚产权的责任链。
- 访问者:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
- 策略:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。策略模式有三个角色:抽象策略(Strategy)类;具体策略(Concrete Strategy)类;环境(Context)类:
该模式可以消除if else。其实就是接口充当策略,地下有具体的策略实现类,然后调用方context持有策略接口的引用,具体执行哪个策略,需要根据具体的业务需求来定。
- 备忘录:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
- 观察者:定义对象间一对多的依赖关系(发布方维护一个List存放订阅方接口),当一个对象的状态(发布方的某一个字段)发生改变时(需要通知订阅方),所有依赖于它的对象(订阅方)都得到通知自动更新(手动遍历List调用方更新数据,所以订阅方)。
- 模板方法:用一个抽象类定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
父类视角: 一次性,实现一个算法不变的部分(模板方法,final修饰),并将可变部分留给子类实现
子类视角:各个子类中,公共部分被提取出来,集中到一个公共的父类中,避免代码重复;具体实现需要自己重写,可以使用父类提供的钩子方法来定制某些步骤是否需要执行。
- 迭代器:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端需要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决,这种模式可以使不同的集合迭代封装成统一的迭代方式。
- 状态:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。适用于一个对象存在多种状态,状态之间可以相互转换,不同状态下,行为不同。
如上图所示,Activity拥有所有的状态实例,每个状态实现类又拥有Activity引用,通过自身活动的变化实现状态的流转。
- 命令:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作
- 中介者:用一个中介对象封装一些列的对象交互。
中介Mediator,自己内部通过hashmap管理所有的同事,自己内部维护一个自定义名称和同事对应关系的map。当有同事发送消息(调用sendMessage),都会去找中介,调用具体中介(ConcreteMediator)的getMessage方法,此方法用于协调各个同事之间的交互。
- 解释器:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
- 责任链:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系。包含一个抽象处理者,和若干个具体处理者实现类,每一个具体处理者保存着下一个具体处理者,以完成责任链流程流转。