1、单例模式
核心:保证一个类只有一个对象,并且提供一个访问该实例的全局访问点
五种单例模式:
主要:
饿汉式:线程安全,调用效率高,不能延时加载
懒汉式:线程安全,调用效率低,可以延时加载
其它:
枚举单例:线程安全,调用效率高,不能延时加载(可以天然防止反射和反序列化漏洞)
静态内部类式:线程安全,调用效率低,可以延时加载
双重检索式
如何选择:
占用资源少且不需要延时加载:枚举>饿汉
占用资源多且需要延时加载:静态内部>懒汉
2、工厂模式
创建者与调用者分离
核心:实例化对象,甩工厂方法代替new操作
简单工厂模式(常用):不完全满足OPC原则
工厂方法模式:
抽象工厂模式:
3、建造者模式
Builder构造 Director 装配
4、原型模式
实现Cloneable中来自object中的clone方法
Object obj=(Object)Super.clone();
return obj;
深克隆:
Sheep s=(Sheep) obj;
s.birthday=(Date)this.birthday.clone();
或者通过序列化和反序列化实现深复制
5、适配器模式(adapter)
6、代理模式(proxy pattern)
AOP(Aspect Oriented Programming)面向切面编程,其核心就是代理模式
核心角色:
抽象角色(客户,定义代理角色和真实角色的公共对外方法)
^ ^
代理角色(实现抽象角色) -> 真实角色(实现抽象角色)
7、静态代理模式(客户-经纪人-演员)
8、动态代理模式
9、桥接模式
将多个维度的东西比如:电脑品牌与电脑类型分别来表示,然后通过参数形式将二者结合起来。
适用的场景:
处理多层继承结构、处理多维度变化的场景、将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关系。
10、组合模式(component)
把部分与整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。
11、装饰模式(decorator)
动态的为一个对象增加新的功能
12、外观模式
迪米特法则(封装):
一个软件实体应当尽可能少的与其他实体发生相互作用。
13、享元模式(Fly weight)
如果有多个完全相同或者相似的对象,我们可以通过享元模式节省内存。
享元对象能够做到共享的关键是区分了内部状态和外部状态。
内部状态:可以共享,不会随着环境变化而改变
外部状态:不可以共享,会随着环境变化而改变
14、责任链模式(chain of responsibility)
将能够处理同一类请求的对象连成一条链,请求沿着链传递,如果能够处理就处理,处理不了就向后传递。
15、迭代器模式(iterator)
提供一种可以遍历聚合对象的方式
聚合对象:存储数据
迭代器:遍历数据
16、中介者模式(mediator)
17、命令模式(commend)
将一个请求封装成对象,从而我们可以使用不同的请求对客户进行参数化。
18、策略模式(strategy)
19、模板方法模式(Template method)
定义好模板,核心内容用到再实现,模板中定义为抽象方法
20、状态模式(state)
不同状态对应不同行为,用于解决系统中复杂对象的状态转换以及不同状态下行为的封装。
21、观察者模式(observe)
广播,1:N的通知,当目标对象的状态发生改变时,他需要及时告知一系列观察者对象,令他们做出响应。
JAVASE提供了java.util.observable类和java.util.observer接口来实现观察者模式。
22、备忘录模式(memento)
保存某个对象内部状态的拷贝,以后就可以将该对象恢复到原先的状态。
源发器类:包括备份数据与恢复数据两种方法
备忘录类:通过构造器的方法来进行数据备份
负责人类:负责管理备忘录提供备忘录的get/set方法