主要参考https://cyc2018.github.io/CS-Notes/#/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F
创建型
1、单例
懒汉式,性能差
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {
}
public static synchronized Singleton getUniqueInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
饿汉式,不能通过延迟实例化来节省资源
private static Singleton uniqueInstance = new Singleton();
双检锁,volatile避免重排序,防止返回尚未初始化的uniqueInstance
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
静态内部类,只有当调用 getUniqueInstance()
方法从而触发 SingletonHolder.INSTANCE
时 SingletonHolder 才会被加载,此时初始化 INSTANCE 实例,并且 JVM 能确保 INSTANCE 只被实例化一次,简单高效。
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getUniqueInstance() {
return SingletonHolder.INSTANCE;
}
}
枚举实现,该实现是由 JVM 保证只会实例化一次,可以防止反射攻击。
public enum Singleton {
INSTANCE;
}
个人认为内部类和枚举较好,简单高效。
2、简单工厂,没有Factory的接口,SimpleFactory生产不同类型的ConcreteProduct1,ConcreteProduct2等
3、工厂方法,Factory是抽象类,factoryMethod是抽象方法,doSomething处理产品。
4、抽象工厂,提供Factory接口,用于创建 相关的对象家族,即多个相关的Product。
5、建造者(生成器,Builder)模式,封装一个对象的构造过程,并允许按步骤构造。将各个部件的建造请求委派到具体的建造者。比如汽车,拆分成车轮、车门、发动机、方向盘的建造等等,而用户并不关心。
6、原型模式(Prototype),使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象,clone()
行为型
1、责任链,Handler:定义处理请求的接口,处理请求(handleRequest),并且包含了一个后继链(successor),if (successor != null) { successor.handleRequest(request)};
2、命令,将命令封装成对象中。
- Command:命令
- Receiver:命令接收者,也就是命令真正的执行者
- Invoker:通过它来调用命令
- Client:可以设置命令与命令的接收者
3、解释器模式,为语言创建解释器,通常由语言的语法和语法分析来定义。用来解析语义,传入文本Context。
4、迭代器(Iterator),提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。
- Aggregate 是聚合类,其中 createIterator() 方法可以产生一个 Iterator;
- Iterator 主要定义了 hasNext() 和 next() 方法。
- Client 组合了 Aggregate,为了迭代遍历 Aggregate,也需要组合 Iterator。
5、中介者(Mediator)
- Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信。
- Colleague:同事,相关对象
Mediator可以定义方法public abstract void doEvent(String eventType);当特定类型的事件发生后,去调度Colleague
6、备忘录(Memento)
在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态。
- Originator:原始对象
- Caretaker:负责保存好备忘录
- Menento:备忘录,存储原始对象的的状态。备忘录实际上有两个接口,一个是提供给 Caretaker 的窄接口:它只能将备忘录传递给其它对象;一个是提供给 Originator 的宽接口,允许它访问到先前状态所需的所有数据。理想情况是只允许 Originator 访问本备忘录的内部状态。
7、观察者(Observer)
定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态。
主题(Subject)是被观察的对象,而其所有依赖者(Observer)称为观察者。
主题(Subject)具有注册和移除观察者、并通知所有观察者的功能,主题是通过维护一张观察者列表来实现这些操作的。
观察者(Observer)的注册功能需要调用主题的 registerObserver() 方法。
8、状态(State)
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它所属的类。状态机,state不同行为不同。
9、策略(Strategy)
定义一系列算法,封装每个算法,并使它们可以互换。
- Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。
- Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。
10、模板方法(Template Method),将一些步骤的实现延迟到子类
11、访问者(Visitor),visitor访问element
使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
12、空对象(Null),使用什么都不做的空对象来代替 NULL,防止NPE
结构型
1、适配器(Adapter),把一个类接口转换成另一个用户需要的接口。
2、桥接(Bridge),传参时传接口,将抽象与实现分离开来,使它们可以独立变化。
3、组合模式(Composite Pattern),依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
class A 里包含List<A>
4、装饰器(Decorator),为对象动态添加功能,在构造器里传入被装饰者。
5、外观(Facade)
6、享元(Flyweight),利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的
- Flyweight:享元对象
- IntrinsicState:内部状态,享元对象共享内部状态
- ExtrinsicState:外部状态,每个享元对象的外部状态不同
7、代理(Proxy)